Metaclass.st
author claus
Sat, 08 Jan 1994 17:29:16 +0100
changeset 33 50cf0f6bc0ad
parent 13 62303f84ff5f
child 44 b262907c93ea
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
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
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:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
every class-class is a subclass of Metaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
- this adds support for creating new subclasses or changing the definition
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
of an already existing class.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
    29
$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.7 1994-01-08 16:27:40 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
!Metaclass methodsFor:'creating classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
name:newName inEnvironment:aSystemDictionary
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
             subclassOf:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
             instanceVariableNames:stringOfInstVarNames
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
             variable:variableBoolean
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
             words:wordsBoolean
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
             pointers:pointersBoolean
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
             classVariableNames:stringOfClassVarNames
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
             poolDictionaries:stringOfPoolNames
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
             category:categoryString
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
             comment:commentString
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
             changed:changed
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    46
    "this is the main workhorse for installing new classes - special care
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    47
     has to be taken, when changing an existing classes definition. In this
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    48
     case, some or all of the methods and subclasses methods have to be
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    49
     recompiled.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    50
     Also, the old class(es) are still kept (but not accessable as a global),
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    51
     to allow existing instances some life. 
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    52
     This might change in the future.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    53
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    54
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
    |newClass newMetaclass nInstVars nameString classSymbol oldClass 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
     allSubclasses classVarChange instVarChange superClassChange newComment
10
claus
parents: 5
diff changeset
    57
     changeSet1 changeSet2 offset oldOffsets newOffsets addedNames
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    58
     anyChange oldInstVars newInstVars oldClassVars newClassVars upd|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    59
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    60
    "this method is too complex and should be splitted into managable pieces ..."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    61
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    62
    newName = aClass name ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    63
        self error:'trying to create circular class definition'.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    64
        ^ nil
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    65
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    nInstVars := stringOfInstVarNames countWords.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
    nameString := newName asString.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    69
    classSymbol := newName asSymbol.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    newComment := commentString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    72
    "look, if it already exists as a class"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
    (aSystemDictionary includesKey:classSymbol) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
        oldClass := aSystemDictionary at:classSymbol.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    75
        (oldClass isBehavior not or:[oldClass name ~= newName]) ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    76
            oldClass := nil.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    77
        ] ifFalse:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    78
            oldClass allSuperclasses do:[:aClass |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    79
                aClass name = newName ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    80
                    self error:'trying to create circular class definition'.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    81
                    ^ nil
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    82
                ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    83
            ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    84
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    85
            newComment isNil ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    86
                newComment := oldClass comment
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    87
            ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
    "create the metaclass first"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    newMetaclass setSuperclass:(aClass class).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
    newMetaclass instSize:(aClass class instSize).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
    newMetaclass flags:0.            "not indexed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
    newMetaclass setName:(nameString , 'class').
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    newMetaclass classVariableString:'' "stringOfClassVarNames".
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
    newMetaclass setComment:newComment category:categoryString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
    newClass setSuperclass:aClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    newClass instSize:(aClass instSize + nInstVars).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
    (variableBoolean == true) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
        pointersBoolean ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
            newClass flags:4         "pointerarray"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
            wordsBoolean ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
                newClass flags:2     "wordarray"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
                newClass flags:1     "bytearray"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
        "this is a backward compatible hack"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
        (variableBoolean == #float) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
            newClass flags:6         "float array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
            (variableBoolean == #double) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
                newClass flags:7     "double array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
                (variableBoolean == #long) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
                    newClass flags:3     "long array"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
                ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
                    newClass flags:0   
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
                ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
    newClass setName:nameString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
    (nInstVars ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
        newClass instanceVariableString:stringOfInstVarNames
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    oldClass notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
        "setting first will make new class clear obsolete classvars"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
        newClass setClassVariableString:(oldClass classVariableString)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    newClass classVariableString:stringOfClassVarNames.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
2
claus
parents: 1
diff changeset
   142
    oldClass isNil ifTrue:[
claus
parents: 1
diff changeset
   143
        self addChangeRecordForClass:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
        commentString notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
            newClass comment:commentString
2
claus
parents: 1
diff changeset
   147
        ].
claus
parents: 1
diff changeset
   148
        aSystemDictionary at:classSymbol put:newClass.
claus
parents: 1
diff changeset
   149
        Smalltalk changed.
claus
parents: 1
diff changeset
   150
        ^ newClass
claus
parents: 1
diff changeset
   151
    ].
claus
parents: 1
diff changeset
   152
10
claus
parents: 5
diff changeset
   153
claus
parents: 5
diff changeset
   154
    oldInstVars := oldClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   155
    newInstVars := newClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   156
    oldClassVars := oldClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   157
    newClassVars := newClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   158
2
claus
parents: 1
diff changeset
   159
    "if only category/comment has changed, do not recompile .."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
2
claus
parents: 1
diff changeset
   161
    (oldClass superclass == newClass superclass) ifTrue:[
claus
parents: 1
diff changeset
   162
      (oldClass instSize == newClass instSize) ifTrue:[
claus
parents: 1
diff changeset
   163
        (oldClass flags == newClass flags) ifTrue:[
claus
parents: 1
diff changeset
   164
          (oldClass name = newClass name) ifTrue:[
10
claus
parents: 5
diff changeset
   165
            (oldInstVars = newInstVars) ifTrue:[
claus
parents: 5
diff changeset
   166
              (oldClassVars = newClassVars) ifTrue:[
claus
parents: 5
diff changeset
   167
                anyChange := false.
claus
parents: 5
diff changeset
   168
claus
parents: 5
diff changeset
   169
claus
parents: 5
diff changeset
   170
                oldClass instanceVariableString:(newClass instanceVariableString).
claus
parents: 5
diff changeset
   171
                oldClass setClassVariableString:(newClass classVariableString).
claus
parents: 5
diff changeset
   172
2
claus
parents: 1
diff changeset
   173
                (newComment ~= oldClass comment) ifTrue:[
10
claus
parents: 5
diff changeset
   174
                    oldClass comment:newComment.        "already writes change-chunk"
2
claus
parents: 1
diff changeset
   175
                ]. 
claus
parents: 1
diff changeset
   176
                oldClass category ~= categoryString ifTrue:[
claus
parents: 1
diff changeset
   177
                    "notify change of organization"
10
claus
parents: 5
diff changeset
   178
                    oldClass category:categoryString. 
claus
parents: 5
diff changeset
   179
                    self addChangeRecordForClass:newClass.
2
claus
parents: 1
diff changeset
   180
                    Smalltalk changed
claus
parents: 1
diff changeset
   181
                ].
claus
parents: 1
diff changeset
   182
                "notify change of class"
claus
parents: 1
diff changeset
   183
                oldClass changed.
claus
parents: 1
diff changeset
   184
                ^ oldClass
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   185
              ].
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   186
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   187
              "when we arrive here, class variables have changed"
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   188
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   189
              (newComment ~= oldClass comment) ifTrue:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   190
                  oldClass comment:newComment.        "already writes change-chunk"
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   191
              ]. 
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   192
              oldClass category ~= categoryString ifTrue:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   193
                  "notify change of organization"
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   194
                  oldClass category:categoryString. 
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   195
                  Smalltalk changed
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   196
              ].
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   197
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   198
              oldClass classVariableString:stringOfClassVarNames.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   199
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   200
              changeSet1 := Set new.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   201
              oldClassVars do:[:nm |
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   202
                  (newClassVars includes:nm) ifFalse:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   203
                      changeSet1 add:nm
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   204
                  ]
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   205
              ].
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   206
              newClassVars do:[:nm |
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   207
                  (oldClassVars includes:nm) ifFalse:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   208
                      changeSet1 add:nm
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   209
                  ]
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   210
              ].
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   211
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   212
              "recompile all methods accessing set of changed classvars
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   213
               here and also in all subclasses ..."
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   214
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   215
              "dont update change file for the recompilation"
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   216
              upd := Class updateChanges:false.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   217
" "
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   218
              Transcript showCr:'recompiling class&inst methods accessing ' , changeSet1 printString.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   219
" "
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   220
              oldClass withAllSubclasses do:[:aClass |
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   221
                  aClass class recompileMethodsAccessingAny:changeSet1.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   222
                  aClass recompileMethodsAccessingAny:changeSet1.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   223
              ].
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   224
              Class updateChanges:upd.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   225
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   226
              "notify change of class"
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   227
              self addChangeRecordForClass:oldClass.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   228
              oldClass changed.
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   229
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   230
              ^ oldClass
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
          ]
2
claus
parents: 1
diff changeset
   233
        ]
claus
parents: 1
diff changeset
   234
      ]
claus
parents: 1
diff changeset
   235
    ].
claus
parents: 1
diff changeset
   236
10
claus
parents: 5
diff changeset
   237
    "tell dependents of class ..."
claus
parents: 5
diff changeset
   238
    oldClass changed.
claus
parents: 5
diff changeset
   239
2
claus
parents: 1
diff changeset
   240
    "catch special case, where superclass changed its layout and thus
claus
parents: 1
diff changeset
   241
     forced redefinition of this class - this will not be logged here"
claus
parents: 1
diff changeset
   242
claus
parents: 1
diff changeset
   243
    (newComment ~= oldClass comment) ifTrue:[
claus
parents: 1
diff changeset
   244
        newClass comment:newComment
claus
parents: 1
diff changeset
   245
    ].
claus
parents: 1
diff changeset
   246
claus
parents: 1
diff changeset
   247
    superClassChange := oldClass superclass ~~ newClass superclass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   249
    "dont allow built-in classes to be modified"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   250
    (oldClass notNil and:[oldClass isBuiltInClass and:[superClassChange]]) ifTrue:[
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   251
        self error:'the inheritance of this class is fixed - you cannot change it'.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   252
        ^ oldClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   253
    ].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   254
2
claus
parents: 1
diff changeset
   255
    (superClassChange 
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   256
     and:[(oldClass superclass isNil or:[oldClass superclass name = newClass superclass name])
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   257
     and:[(oldClassVars = newClassVars) 
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   258
     and:[(oldInstVars = newInstVars)
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   259
     and:[newComment = oldClass comment]]]]) ifFalse:[
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   260
        self addChangeRecordForClass:newClass.
2
claus
parents: 1
diff changeset
   261
    ].
claus
parents: 1
diff changeset
   262
claus
parents: 1
diff changeset
   263
    changeSet1 := Set new.
claus
parents: 1
diff changeset
   264
    changeSet2 := Set new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
2
claus
parents: 1
diff changeset
   266
    classVarChange := false.
claus
parents: 1
diff changeset
   267
claus
parents: 1
diff changeset
   268
    superClassChange ifTrue:[
claus
parents: 1
diff changeset
   269
        "superclass changed,
claus
parents: 1
diff changeset
   270
         must recompile all class methods accessing any classvar"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
2
claus
parents: 1
diff changeset
   272
        oldClass allClassVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   273
        newClass allClassVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   274
claus
parents: 1
diff changeset
   275
" "
claus
parents: 1
diff changeset
   276
        Transcript showCr:'recompiling class methods accessing any classvar'.
claus
parents: 1
diff changeset
   277
" "
claus
parents: 1
diff changeset
   278
        self copyInvalidatedMethodsFrom:(oldClass class) for:newMetaclass accessingAny:changeSet1.
claus
parents: 1
diff changeset
   279
        newMetaclass recompileInvalidatedMethods.
claus
parents: 1
diff changeset
   280
    ] ifFalse:[
claus
parents: 1
diff changeset
   281
        "same superclass, find out which classvars have changed"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
10
claus
parents: 5
diff changeset
   283
        classVarChange := oldClassVars ~= newClassVars.
2
claus
parents: 1
diff changeset
   284
        classVarChange ifTrue:[
10
claus
parents: 5
diff changeset
   285
            oldClassVars do:[:nm |
claus
parents: 5
diff changeset
   286
                (newClassVars includes:nm) ifFalse:[
claus
parents: 5
diff changeset
   287
                    changeSet1 add:nm
claus
parents: 5
diff changeset
   288
                ]
claus
parents: 5
diff changeset
   289
            ].
claus
parents: 5
diff changeset
   290
            newClassVars do:[:nm |
claus
parents: 5
diff changeset
   291
                (oldClassVars includes:nm) ifFalse:[
claus
parents: 5
diff changeset
   292
                    changeSet1 add:nm
claus
parents: 5
diff changeset
   293
                ]
2
claus
parents: 1
diff changeset
   294
            ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
2
claus
parents: 1
diff changeset
   297
" "
claus
parents: 1
diff changeset
   298
        Transcript showCr:'recompiling class methods accessing ' , changeSet1 printString.
claus
parents: 1
diff changeset
   299
" "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
        classVarChange ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
            "must recompile class-methods"
2
claus
parents: 1
diff changeset
   302
            self copyInvalidatedMethodsFrom:(oldClass class) for:newMetaclass accessingAny:changeSet1.
claus
parents: 1
diff changeset
   303
            newMetaclass recompileInvalidatedMethods.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
            "class methods still work"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
            self copyMethodsFrom:(oldClass class) for:newMetaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
        ].
2
claus
parents: 1
diff changeset
   308
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
2
claus
parents: 1
diff changeset
   310
    superClassChange ifTrue:[
claus
parents: 1
diff changeset
   311
        "superclass changed,
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   312
         must recompile all class methods accessing any class or instvar"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   313
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   314
        "no, if number of instvars is the same, only the changed ones ..."
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   315
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   316
        "find set of changed instvars"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   317
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   318
        offset := 0. oldOffsets := Dictionary new.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   319
        oldClass allInstVarNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   320
        offset := 0. newOffsets := Dictionary new.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   321
        newClass allInstVarNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   322
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   323
        oldOffsets associationsDo:[:a |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   324
            |k|
2
claus
parents: 1
diff changeset
   325
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   326
            k := a key.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   327
            (newOffsets includesKey:k) ifFalse:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   328
                changeSet2 add:k
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   329
            ] ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   330
                (a value ~~ (newOffsets at:k)) ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   331
                    changeSet2 add:k
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   332
                ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   333
            ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   334
        ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   335
        newOffsets associationsDo:[:a |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   336
            |k|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   337
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   338
            k := a key.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   339
            (oldOffsets includesKey:k) ifFalse:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   340
                changeSet2 add:k
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   341
            ] ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   342
                (a value ~~ (oldOffsets at:k)) ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   343
                    changeSet2 add:k
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   344
                ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   345
            ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   346
        ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   347
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   348
        changeSet1 do:[:nm | changeSet2 add:nm].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   349
" "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   350
        Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , '
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   351
 ...'.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   352
" "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   353
        self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet2.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   354
        newClass recompileInvalidatedMethods.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   355
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   356
false ifTrue:[
2
claus
parents: 1
diff changeset
   357
        oldClass allClassVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   358
        newClass allClassVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   359
        oldClass allInstVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   360
        newClass allInstVarNames do:[:nm | changeSet1 add:nm].
claus
parents: 1
diff changeset
   361
claus
parents: 1
diff changeset
   362
" "
claus
parents: 1
diff changeset
   363
        Transcript showCr:'recompiling instance methods accessing any class or instvar' .
claus
parents: 1
diff changeset
   364
" "
claus
parents: 1
diff changeset
   365
        self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet1.
claus
parents: 1
diff changeset
   366
        newClass recompileInvalidatedMethods.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   367
]
2
claus
parents: 1
diff changeset
   368
    ] ifFalse:[
10
claus
parents: 5
diff changeset
   369
        instVarChange := oldInstVars ~= newInstVars.
2
claus
parents: 1
diff changeset
   370
        instVarChange ifFalse:[
claus
parents: 1
diff changeset
   371
            classVarChange ifTrue:[
claus
parents: 1
diff changeset
   372
                "recompile all inst methods accessing classvars"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
2
claus
parents: 1
diff changeset
   374
" "
claus
parents: 1
diff changeset
   375
                Transcript showCr:'recompiling instance methods accessing ' , changeSet1 printString , ' ...'.
claus
parents: 1
diff changeset
   376
" "
claus
parents: 1
diff changeset
   377
                self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet1.
claus
parents: 1
diff changeset
   378
                newClass recompileInvalidatedMethods.
claus
parents: 1
diff changeset
   379
            ]
claus
parents: 1
diff changeset
   380
        ] ifTrue:[
10
claus
parents: 5
diff changeset
   381
            instVarChange := (oldInstVars ~= newInstVars).
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   382
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   383
            "dont allow built-in classes to be modified"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   384
            (oldClass notNil and:[oldClass isBuiltInClass and:[instVarChange]]) ifTrue:[
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   385
                self error:'the layout of this class is fixed - you cannot change it'.
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   386
                ^ oldClass
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   387
            ].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   388
2
claus
parents: 1
diff changeset
   389
            instVarChange ifTrue:[
claus
parents: 1
diff changeset
   390
10
claus
parents: 5
diff changeset
   391
                ((oldInstVars size == 0) 
claus
parents: 5
diff changeset
   392
                or:[newInstVars startsWith:oldInstVars]) ifTrue:[
2
claus
parents: 1
diff changeset
   393
                    "new variable(s) has/have been added - old methods still work"
claus
parents: 1
diff changeset
   394
claus
parents: 1
diff changeset
   395
                    Transcript showCr:'copying methods ...'.
claus
parents: 1
diff changeset
   396
                    self copyMethodsFrom:oldClass for:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
2
claus
parents: 1
diff changeset
   398
                    "but have to recompile methods accessing stuff now defined
claus
parents: 1
diff changeset
   399
                     (it might have been a global before ...)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
10
claus
parents: 5
diff changeset
   401
                    addedNames := newInstVars select:[:nm | (oldInstVars includes:nm) not].
2
claus
parents: 1
diff changeset
   402
                    changeSet1 do:[:nm | addedNames add:nm].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
2
claus
parents: 1
diff changeset
   404
" "
claus
parents: 1
diff changeset
   405
                    Transcript showCr:'recompiling instance methods accessing ' , addedNames printString ,  '...'.
claus
parents: 1
diff changeset
   406
" "
claus
parents: 1
diff changeset
   407
                    newClass recompileMethodsAccessingAny:addedNames.
claus
parents: 1
diff changeset
   408
                ] ifFalse:[
claus
parents: 1
diff changeset
   409
                    "find set of changed instvars"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
2
claus
parents: 1
diff changeset
   411
                    offset := 0. oldOffsets := Dictionary new.
10
claus
parents: 5
diff changeset
   412
                    oldInstVars do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
2
claus
parents: 1
diff changeset
   413
                    offset := 0. newOffsets := Dictionary new.
10
claus
parents: 5
diff changeset
   414
                    newInstVars do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
2
claus
parents: 1
diff changeset
   415
claus
parents: 1
diff changeset
   416
                    oldOffsets associationsDo:[:a |
claus
parents: 1
diff changeset
   417
                        |k|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
2
claus
parents: 1
diff changeset
   419
                        k := a key.
claus
parents: 1
diff changeset
   420
                        (newOffsets includesKey:k) ifFalse:[
claus
parents: 1
diff changeset
   421
                            changeSet2 add:k
claus
parents: 1
diff changeset
   422
                        ] ifTrue:[
claus
parents: 1
diff changeset
   423
                            (a value ~~ (newOffsets at:k)) ifTrue:[
claus
parents: 1
diff changeset
   424
                                changeSet2 add:k
claus
parents: 1
diff changeset
   425
                            ]
claus
parents: 1
diff changeset
   426
                        ]
claus
parents: 1
diff changeset
   427
                    ].
claus
parents: 1
diff changeset
   428
                    newOffsets associationsDo:[:a |
claus
parents: 1
diff changeset
   429
                        |k|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
2
claus
parents: 1
diff changeset
   431
                        k := a key.
claus
parents: 1
diff changeset
   432
                        (oldOffsets includesKey:k) ifFalse:[
claus
parents: 1
diff changeset
   433
                            changeSet2 add:k
claus
parents: 1
diff changeset
   434
                        ] ifTrue:[
claus
parents: 1
diff changeset
   435
                            (a value ~~ (oldOffsets at:k)) ifTrue:[
claus
parents: 1
diff changeset
   436
                                changeSet2 add:k
claus
parents: 1
diff changeset
   437
                            ]
claus
parents: 1
diff changeset
   438
                        ]
claus
parents: 1
diff changeset
   439
                    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
2
claus
parents: 1
diff changeset
   441
                    changeSet1 do:[:nm | changeSet2 add:nm].
claus
parents: 1
diff changeset
   442
" "
claus
parents: 1
diff changeset
   443
                    Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , ' ...'.
claus
parents: 1
diff changeset
   444
" "
claus
parents: 1
diff changeset
   445
                    self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet2.
claus
parents: 1
diff changeset
   446
                    newClass recompileInvalidatedMethods.
claus
parents: 1
diff changeset
   447
claus
parents: 1
diff changeset
   448
                ].
claus
parents: 1
diff changeset
   449
            ].
claus
parents: 1
diff changeset
   450
        ].
claus
parents: 1
diff changeset
   451
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
2
claus
parents: 1
diff changeset
   453
    "get list of all subclasses - do before superclass is changed"
claus
parents: 1
diff changeset
   454
claus
parents: 1
diff changeset
   455
    allSubclasses := oldClass allSubclasses.
claus
parents: 1
diff changeset
   456
claus
parents: 1
diff changeset
   457
    "update superclass of immediate subclasses - this forces recompilation if needed"
claus
parents: 1
diff changeset
   458
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   459
    "dont update change file for the subclass changes"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   460
    upd := Class updateChanges:false.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   461
    [
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   462
        oldClass subclassesDo:[:aClass |
2
claus
parents: 1
diff changeset
   463
" "
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   464
            Transcript showCr:'changing superclass of:' , aClass name.
2
claus
parents: 1
diff changeset
   465
" "
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   466
            aClass superclass:newClass
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   467
        ]
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   468
    ] valueNowOrOnUnwindDo:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   469
        Class updateChanges:upd.
2
claus
parents: 1
diff changeset
   470
    ].
claus
parents: 1
diff changeset
   471
claus
parents: 1
diff changeset
   472
    aSystemDictionary at:classSymbol put:newClass.
claus
parents: 1
diff changeset
   473
    ObjectMemory flushCaches.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
new
2
claus
parents: 1
diff changeset
   478
    "create & return a new metaclass (a classes class)"
claus
parents: 1
diff changeset
   479
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
    newClass setSuperclass:(Object class)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
                 selectors:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
                   methods:(Array new:0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
                  instSize:0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
                     flags:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
    newClass setComment:(self comment) category:(self category).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
!Metaclass methodsFor:'class instance variables'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
instanceVariableNames:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
    "changing / adding class-inst vars -
2
claus
parents: 1
diff changeset
   496
     this actually creates a new metaclass and class."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
    |newClass newMetaclass nClassInstVars oldClass 
2
claus
parents: 1
diff changeset
   499
     allSubclasses t oldVars
claus
parents: 1
diff changeset
   500
     oldNames newNames addedNames
claus
parents: 1
diff changeset
   501
     oldOffsets newOffsets offset changeSet delta
claus
parents: 1
diff changeset
   502
     oldToNew newSubMeta newSub oldSubMeta oldSuper|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
    oldVars := self instanceVariableString.
2
claus
parents: 1
diff changeset
   505
    aString = oldVars ifTrue:[
claus
parents: 1
diff changeset
   506
"
claus
parents: 1
diff changeset
   507
        Transcript showCr:'no change (', oldVars , ') -> (', aString , ')'.
claus
parents: 1
diff changeset
   508
"
claus
parents: 1
diff changeset
   509
        ^ self
claus
parents: 1
diff changeset
   510
    ].
claus
parents: 1
diff changeset
   511
claus
parents: 1
diff changeset
   512
    oldNames := oldVars asCollectionOfWords.
claus
parents: 1
diff changeset
   513
    newNames := aString asCollectionOfWords.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
2
claus
parents: 1
diff changeset
   515
    oldNames = newNames ifTrue:[
claus
parents: 1
diff changeset
   516
"
claus
parents: 1
diff changeset
   517
        Transcript showCr:'no real change'.
claus
parents: 1
diff changeset
   518
"
claus
parents: 1
diff changeset
   519
        "no real change (just formatting)"
claus
parents: 1
diff changeset
   520
        self instanceVariableString:aString.
claus
parents: 1
diff changeset
   521
        ^ self
claus
parents: 1
diff changeset
   522
    ]. 
claus
parents: 1
diff changeset
   523
claus
parents: 1
diff changeset
   524
    nClassInstVars := newNames size.
claus
parents: 1
diff changeset
   525
claus
parents: 1
diff changeset
   526
"
claus
parents: 1
diff changeset
   527
    Transcript showCr:'create new class/metaclass'.
claus
parents: 1
diff changeset
   528
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    "create the new metaclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
    newMetaclass setSuperclass:superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
    newMetaclass instSize:(superclass instSize + nClassInstVars).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
    (nClassInstVars ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
        newMetaclass instanceVariableString:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    newMetaclass flags:0.            "not indexed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
    newMetaclass setName:name.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
    newMetaclass classVariableString:classvars.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
    newMetaclass category:category.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
    newMetaclass setComment:comment.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
    "find the class which is my sole instance"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    t := Smalltalk allClasses select:[:element | element class == self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
    (t size ~~ 1) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
        self error:'oops - I should have exactly one instance'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
        ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
    oldClass := t anElement.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
    "create a new class"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
    newClass setSuperclass:(oldClass superclass).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    newClass instSize:(oldClass instSize).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
    newClass flags:(oldClass flags).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
    newClass setName:(oldClass name).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
    newClass instanceVariableString:(oldClass instanceVariableString).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
    newClass classVariableString:(oldClass classVariableString).
2
claus
parents: 1
diff changeset
   560
    newClass setComment:(oldClass comment).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
    newClass category:(oldClass category).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
2
claus
parents: 1
diff changeset
   563
    offset := 0. oldOffsets := Dictionary new.
claus
parents: 1
diff changeset
   564
    oldNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
claus
parents: 1
diff changeset
   565
    offset := 0. newOffsets := Dictionary new.
claus
parents: 1
diff changeset
   566
    newNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
claus
parents: 1
diff changeset
   567
    changeSet := Set new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
2
claus
parents: 1
diff changeset
   569
    oldOffsets associationsDo:[:a |
10
claus
parents: 5
diff changeset
   570
        |k|
claus
parents: 5
diff changeset
   571
claus
parents: 5
diff changeset
   572
        k := a key.
claus
parents: 5
diff changeset
   573
        (newOffsets includesKey:k) ifFalse:[
claus
parents: 5
diff changeset
   574
            changeSet add:k
2
claus
parents: 1
diff changeset
   575
        ] ifTrue:[
10
claus
parents: 5
diff changeset
   576
            (a value ~~ (newOffsets at:k)) ifTrue:[
claus
parents: 5
diff changeset
   577
                changeSet add:k
2
claus
parents: 1
diff changeset
   578
            ]
claus
parents: 1
diff changeset
   579
        ]
claus
parents: 1
diff changeset
   580
    ].
claus
parents: 1
diff changeset
   581
    newOffsets associationsDo:[:a |
10
claus
parents: 5
diff changeset
   582
        |k|
claus
parents: 5
diff changeset
   583
claus
parents: 5
diff changeset
   584
        k := a key.
claus
parents: 5
diff changeset
   585
        (oldOffsets includesKey:k) ifFalse:[
claus
parents: 5
diff changeset
   586
            changeSet add:k
2
claus
parents: 1
diff changeset
   587
        ] ifTrue:[
10
claus
parents: 5
diff changeset
   588
            (a value ~~ (oldOffsets at:k)) ifTrue:[
claus
parents: 5
diff changeset
   589
                changeSet add:k
2
claus
parents: 1
diff changeset
   590
            ]
claus
parents: 1
diff changeset
   591
        ]
claus
parents: 1
diff changeset
   592
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
2
claus
parents: 1
diff changeset
   594
    ((oldNames size == 0) 
claus
parents: 1
diff changeset
   595
    or:[newNames startsWith:oldNames]) ifTrue:[
claus
parents: 1
diff changeset
   596
        "new variable(s) has/have been added - old methods still work"
claus
parents: 1
diff changeset
   597
claus
parents: 1
diff changeset
   598
        Transcript showCr:'copying methods ...'.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
        self copyMethodsFrom:self for:newMetaclass.
2
claus
parents: 1
diff changeset
   600
        self copyMethodsFrom:oldClass for:newClass.
claus
parents: 1
diff changeset
   601
claus
parents: 1
diff changeset
   602
        "but have to recompile methods accessing stuff now defined
claus
parents: 1
diff changeset
   603
         (it might have been a global before ...)"
claus
parents: 1
diff changeset
   604
claus
parents: 1
diff changeset
   605
        addedNames := newNames select:[:nm | (oldNames includes:nm) not].
claus
parents: 1
diff changeset
   606
"
claus
parents: 1
diff changeset
   607
        Transcript showCr:'recompiling methods accessing ' , 
claus
parents: 1
diff changeset
   608
                          addedNames printString ,  '...'.
claus
parents: 1
diff changeset
   609
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
        "recompile class-methods"
2
claus
parents: 1
diff changeset
   611
        newMetaclass recompileMethodsAccessingAny:addedNames.
claus
parents: 1
diff changeset
   612
    ] ifFalse:[
claus
parents: 1
diff changeset
   613
"
claus
parents: 1
diff changeset
   614
        Transcript showCr:'recompiling methods accessing ' ,
claus
parents: 1
diff changeset
   615
                          changeSet printString , ' ...'.
claus
parents: 1
diff changeset
   616
"
claus
parents: 1
diff changeset
   617
        "recompile class-methods"
claus
parents: 1
diff changeset
   618
        self copyInvalidatedMethodsFrom:self for:newMetaclass accessingAny:changeSet.
claus
parents: 1
diff changeset
   619
        newMetaclass recompileInvalidatedMethods.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
2
claus
parents: 1
diff changeset
   621
        self copyMethodsFrom:oldClass for:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
2
claus
parents: 1
diff changeset
   624
    delta := newNames size - oldNames size.
claus
parents: 1
diff changeset
   625
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
    "get list of all subclasses - do before superclass is changed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
a27a279701f8 Initial revision
claus
parents:
diff changeset
   628
    allSubclasses := oldClass allSubclasses.
2
claus
parents: 1
diff changeset
   629
    allSubclasses := allSubclasses asSortedCollection:[:a :b |
claus
parents: 1
diff changeset
   630
                                b isSubclassOf:a
claus
parents: 1
diff changeset
   631
                     ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
2
claus
parents: 1
diff changeset
   633
    oldToNew := IdentityDictionary new.
claus
parents: 1
diff changeset
   634
claus
parents: 1
diff changeset
   635
    "create a new class tree, based on new version"
claus
parents: 1
diff changeset
   636
claus
parents: 1
diff changeset
   637
    allSubclasses do:[:aSubclass |
claus
parents: 1
diff changeset
   638
        oldSuper := aSubclass superclass.
claus
parents: 1
diff changeset
   639
        oldSubMeta := aSubclass class.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
2
claus
parents: 1
diff changeset
   641
        newSubMeta := Metaclass new.
claus
parents: 1
diff changeset
   642
        oldSuper == oldClass ifTrue:[
claus
parents: 1
diff changeset
   643
            newSubMeta setSuperclass:newMetaclass.
claus
parents: 1
diff changeset
   644
        ] ifFalse:[
claus
parents: 1
diff changeset
   645
            newSubMeta setSuperclass:(oldToNew at:oldSuper) class.
claus
parents: 1
diff changeset
   646
        ].
claus
parents: 1
diff changeset
   647
        newSubMeta instSize:(oldSubMeta instSize + delta).
claus
parents: 1
diff changeset
   648
        newSubMeta flags:(oldSubMeta flags).
claus
parents: 1
diff changeset
   649
        newSubMeta setName:(oldSubMeta name).
claus
parents: 1
diff changeset
   650
        newSubMeta classVariableString:(oldSubMeta classVariableString).
claus
parents: 1
diff changeset
   651
        newSubMeta setComment:(oldSubMeta comment).
claus
parents: 1
diff changeset
   652
        newSubMeta category:(oldSubMeta category).
claus
parents: 1
diff changeset
   653
claus
parents: 1
diff changeset
   654
        newSub := newSubMeta new.
claus
parents: 1
diff changeset
   655
        oldSuper == oldClass ifTrue:[
claus
parents: 1
diff changeset
   656
            newSub setSuperclass:newClass.
claus
parents: 1
diff changeset
   657
        ] ifFalse:[
claus
parents: 1
diff changeset
   658
            newSub setSuperclass:(oldToNew at:oldSuper).
claus
parents: 1
diff changeset
   659
        ].
claus
parents: 1
diff changeset
   660
        newSub setSelectors:(aSubclass selectors).
claus
parents: 1
diff changeset
   661
        newSub setMethodDictionary:(aSubclass methodDictionary).
claus
parents: 1
diff changeset
   662
        newSub setName:(aSubclass name).
claus
parents: 1
diff changeset
   663
        newSub classVariableString:(aSubclass classVariableString).
claus
parents: 1
diff changeset
   664
        newSub setComment:(aSubclass comment).
claus
parents: 1
diff changeset
   665
        newSub category:(aSubclass category).
claus
parents: 1
diff changeset
   666
claus
parents: 1
diff changeset
   667
        oldToNew at:aSubclass put:newSub.
claus
parents: 1
diff changeset
   668
claus
parents: 1
diff changeset
   669
        aSubclass setName:(aSubclass name , '-old').
claus
parents: 1
diff changeset
   670
        aSubclass category:'obsolete classes'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
2
claus
parents: 1
diff changeset
   673
    "recompile what needs to be"
claus
parents: 1
diff changeset
   674
claus
parents: 1
diff changeset
   675
    delta == 0 ifTrue:[
claus
parents: 1
diff changeset
   676
        "only have to recompile class methods accessing 
claus
parents: 1
diff changeset
   677
         class instvars from changeset"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
2
claus
parents: 1
diff changeset
   679
        allSubclasses do:[:aClass |
claus
parents: 1
diff changeset
   680
            aClass class recompileMethodsAccessingAny:changeSet.
claus
parents: 1
diff changeset
   681
        ]
claus
parents: 1
diff changeset
   682
    ] ifFalse:[
claus
parents: 1
diff changeset
   683
        "have to recompile all class methods accessing class instvars"
claus
parents: 1
diff changeset
   684
claus
parents: 1
diff changeset
   685
        allSubclasses do:[:aClass |
claus
parents: 1
diff changeset
   686
            |classInstVars|
claus
parents: 1
diff changeset
   687
claus
parents: 1
diff changeset
   688
            classInstVars := aClass class allInstVarNames.
claus
parents: 1
diff changeset
   689
            aClass class recompileMethodsAccessingAny:classInstVars.
claus
parents: 1
diff changeset
   690
        ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
2
claus
parents: 1
diff changeset
   693
    self addChangeRecordForClassInstvars:newClass.
claus
parents: 1
diff changeset
   694
claus
parents: 1
diff changeset
   695
    "install all new classes"
claus
parents: 1
diff changeset
   696
claus
parents: 1
diff changeset
   697
    Smalltalk at:(oldClass name asSymbol) put:newClass.
claus
parents: 1
diff changeset
   698
    ObjectMemory flushCachesFor:oldClass.
claus
parents: 1
diff changeset
   699
    allSubclasses do:[:aClass |
claus
parents: 1
diff changeset
   700
        Smalltalk at:(oldToNew at:aClass) name asSymbol put:(oldToNew at:aClass).
claus
parents: 1
diff changeset
   701
        ObjectMemory flushCachesFor:aClass.
claus
parents: 1
diff changeset
   702
    ].
claus
parents: 1
diff changeset
   703
10
claus
parents: 5
diff changeset
   704
    "tell dependents of class ..."
claus
parents: 5
diff changeset
   705
2
claus
parents: 1
diff changeset
   706
    oldClass changed.
claus
parents: 1
diff changeset
   707
    self changed.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
    ^ newMetaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
!Metaclass methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
isMeta
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
    "return true, if the receiver is some kind of metaclass;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
     true is returned here. Redefines isMeta in Object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
!Metaclass methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
copyMethodsFrom:oldClass for:newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
    "when a class has changed, but metaclass is unaffected (i.e. classVars
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
     have not changed) there is no need to recompile them"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
2
claus
parents: 1
diff changeset
   726
    newClass selectors:(oldClass selectors copy) methods:(oldClass methodDictionary copy)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
copyInvalidatedMethodsFrom:oldClass for:newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
    "when a class has been changed, copy all old methods into the new class
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
     - changing code to a trap method giving an error message;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
     this allows us to keep the source while trapping uncompilable (due to
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
     now undefined instvars) methods"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
2
claus
parents: 1
diff changeset
   735
    |trap trapCode trapByteCode newMethod oldMethodArray newMethodArray|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
    trap := Method compiledMethodAt:#invalidMethod.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
2
claus
parents: 1
diff changeset
   741
    oldMethodArray := oldClass methodDictionary.
claus
parents: 1
diff changeset
   742
    newMethodArray := Array new:(oldMethodArray size).
claus
parents: 1
diff changeset
   743
    newClass selectors:(oldClass selectors copy) methods:newMethodArray.
claus
parents: 1
diff changeset
   744
    1 to:oldMethodArray size do:[:i |
claus
parents: 1
diff changeset
   745
        newMethod := (oldMethodArray at:i) copy.
claus
parents: 1
diff changeset
   746
        newMethod code:trapCode.
claus
parents: 1
diff changeset
   747
        newMethod literals:nil.
claus
parents: 1
diff changeset
   748
        newMethod byteCode:trapByteCode.
claus
parents: 1
diff changeset
   749
        newMethodArray at:i put:newMethod
claus
parents: 1
diff changeset
   750
    ]
claus
parents: 1
diff changeset
   751
!
claus
parents: 1
diff changeset
   752
claus
parents: 1
diff changeset
   753
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames
claus
parents: 1
diff changeset
   754
    "copy all methods from oldClass to newClass. Those methods accessing
claus
parents: 1
diff changeset
   755
     a variable in setOfNames will be copied as invalid method, leading to
claus
parents: 1
diff changeset
   756
     a trap when its executed."
claus
parents: 1
diff changeset
   757
claus
parents: 1
diff changeset
   758
    |trap trapCode trapByteCode p oldMethod newMethod oldMethodArray newMethodArray|
claus
parents: 1
diff changeset
   759
claus
parents: 1
diff changeset
   760
    trap := Method compiledMethodAt:#invalidMethod.
claus
parents: 1
diff changeset
   761
    trapCode := trap code.
claus
parents: 1
diff changeset
   762
    trapByteCode := trap byteCode.
claus
parents: 1
diff changeset
   763
claus
parents: 1
diff changeset
   764
    oldMethodArray := oldClass methodDictionary.
claus
parents: 1
diff changeset
   765
    newMethodArray := Array new:(oldMethodArray size).
claus
parents: 1
diff changeset
   766
    newClass selectors:(oldClass selectors copy) methods:newMethodArray.
claus
parents: 1
diff changeset
   767
    1 to:oldMethodArray size do:[:i |
claus
parents: 1
diff changeset
   768
        oldMethod := oldMethodArray at:i.
claus
parents: 1
diff changeset
   769
        p := Parser parseMethod:(oldMethod source) in:newClass.
claus
parents: 1
diff changeset
   770
        (p isNil or:[p usedVars notNil and:[p usedVars includesAny:setOfNames]]) ifTrue:[
claus
parents: 1
diff changeset
   771
            newMethod := oldMethod copy.
claus
parents: 1
diff changeset
   772
            newMethod code:trapCode.
claus
parents: 1
diff changeset
   773
            newMethod literals:nil.
claus
parents: 1
diff changeset
   774
            newMethod byteCode:trapByteCode
claus
parents: 1
diff changeset
   775
        ] ifFalse:[
claus
parents: 1
diff changeset
   776
            newMethod := oldMethod.
claus
parents: 1
diff changeset
   777
        ].
claus
parents: 1
diff changeset
   778
        newMethodArray at:i put:newMethod
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
anyInvalidatedMethodsIn:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
    "return true, if aClass has any invalidated methods in it"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
    |trap trapCode trapByteCode|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
    trap := Method compiledMethodAt:#invalidMethod.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
    aClass methodDictionary do:[:aMethod |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   792
        trapCode notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
            (aMethod code == trapCode) ifTrue:[^ true]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   794
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   795
        trapByteCode notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   796
            (aMethod byteCode == trapByteCode) ifTrue:[^ true]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   800
! !