hi adrian

I'm reading your fixes and I have one question in the following

class: oldClass instanceVariableNames: instVarString unsafe: unsafe
        "This is the basic initialization message to change the definition of
        an existing Metaclass"
| instVars newClass needNew copyOfOldClass copyOfOldTraitComposition copyOfOldClassTraitComposition |
        environ := oldClass environment.
        instVars := Scanner new scanFieldNames: instVarString.
        unsafe ifFalse:[
"Run validation checks so we know that we have a good chance for recompilation" (self validateInstvars: instVars from: oldClass forSuper: oldClass superclass) ifFalse:[^nil]. (self validateSubclassFormat: oldClass typeOfClass from: oldClass forSuper: oldClass superclass extra: instVars size) ifFalse:[^nil]].
        "See if we need a new subclass or not"
needNew := self needsSubclassOf: oldClass superclass type: oldClass typeOfClass instanceVariables: instVars from: oldClass.
        needNew ifNil:[^nil]. "some error"
        needNew ifFalse:[^oldClass]. "no new class needed"

        "Create the new class"
        copyOfOldClass := oldClass copy.
        oldClass hasTraitComposition ifTrue: [
copyOfOldTraitComposition := oldClass traitComposition copyTraitExpression ].
        oldClass class hasTraitComposition ifTrue: [
copyOfOldClassTraitComposition := oldClass class traitComposition copyTraitExpression ].
                
        newClass := self
                newSubclassOf: oldClass superclass
                type: oldClass typeOfClass
                instanceVariables: instVars
                from: oldClass.
                
newClass := self recompile: false from: oldClass to: newClass mutate: false.
        
        "... set trait composition..."
        copyOfOldTraitComposition ifNotNil: [
                newClass setTraitComposition: copyOfOldTraitComposition ].
        copyOfOldClassTraitComposition ifNotNil: [
                newClass class setTraitComposition: 
copyOfOldClassTraitComposition ].
        
        self doneCompiling: newClass.
SystemChangeNotifier uniqueInstance classDefinitionChangedFrom: copyOfOldClass to: newClass.
        ^newClass


to get

class: oldClass instanceVariableNames: instVarString unsafe: unsafe
        "This is the basic initialization message to change the definition of
        an existing Metaclass"
        | instVars newClass needNew copyOfOldClass |
        environ := oldClass environment.
        instVars := Scanner new scanFieldNames: instVarString.
        unsafe ifFalse:[
"Run validation checks so we know that we have a good chance for recompilation" (self validateInstvars: instVars from: oldClass forSuper: oldClass superclass) ifFalse:[^nil]. (self validateSubclassFormat: oldClass typeOfClass from: oldClass forSuper: oldClass superclass extra: instVars size) ifFalse:[^nil]].
        "See if we need a new subclass or not"
needNew := self needsSubclassOf: oldClass superclass type: oldClass typeOfClass instanceVariables: instVars from: oldClass.
        needNew ifNil:[^nil]. "some error"
        needNew ifFalse:[^oldClass]. "no new class needed"

        "Create the new class"
        copyOfOldClass := oldClass copy.
        newClass := self
                newSubclassOf: oldClass superclass
                type: oldClass typeOfClass
                instanceVariables: instVars
                from: oldClass.
                
newClass := self recompile: false from: oldClass to: newClass mutate: false.
        self doneCompiling: newClass.
SystemChangeNotifier uniqueInstance classDefinitionChangedFrom: copyOfOldClass to: newClass.
        ^newClass

and change newclass

newSubclassOf: newSuper type: type instanceVariables: instVars from: oldClass "Create a new subclass of the given superclass with the given specification."
        | newFormat newClass |
        "Compute the format of the new class"
        newFormat :=
                self computeFormat: type
                        instSize: instVars size
                        forSuper: newSuper
                        ccIndex: (oldClass ifNil:[0] ifNotNil:[oldClass 
indexIfCompact]).

        newFormat == nil ifTrue:[^nil].

        (oldClass == nil or:[oldClass isMeta not])
ifTrue:[newClass := self privateNewSubclassOf: newSuper from: oldClass]
                ifFalse:[newClass := oldClass clone].

        newClass
                superclass: newSuper
                methodDictionary: MethodDictionary new
                format: newFormat;
                setInstVarNames: instVars.

        oldClass ifNotNil:[
                newClass organization: oldClass organization.
                "Recompile the new class"
                oldClass hasMethods
                        ifTrue:[newClass compileAllFrom: oldClass].

                oldClass hasTraitComposition ifTrue: [
newClass setTraitComposition: oldClass traitComposition copyTraitExpression ].
                oldClass class hasTraitComposition ifTrue: [
newClass class setTraitComposition: oldClass class traitComposition copyTraitExpression ].
                
                self recordClass: oldClass replacedBy: newClass.
        ].

        (oldClass == nil or:[oldClass isObsolete not])
                ifTrue:[newSuper addSubclass: newClass]
                ifFalse:[newSuper addObsoleteSubclass: newClass].

        ^newClass


Now I was wondering why you did not change
newClass := self recompile: false from: oldClass to: newClass mutate: false. too

Stef



_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to