[squeak-dev] The Trunk: Monticello-dtl.672.mcz
Eliot Miranda
eliot.miranda at gmail.com
Wed Aug 9 16:52:07 UTC 2017
Hi David,
I like the intent of these changes but want to discuss the
implementation.
On Sun, Aug 6, 2017 at 9:25 AM, <commits at source.squeak.org> wrote:
> David T. Lewis uploaded a new version of Monticello to project The Trunk:
> http://source.squeak.org/trunk/Monticello-dtl.672.mcz
>
> ==================== Summary ====================
>
> Name: Monticello-dtl.672
> Author: dtl
> Time: 6 August 2017, 12:25:45.326051 pm
> UUID: dfe33bfa-dc27-4c01-a1db-234bd7e4433c
> Ancestors: Monticello-eem.671
>
> CompiledCode and its subclasses are a special case, and are identified as
> class type #compiledMethod rather than #bytes. An MCClassDefinition should
> identify this type correctly, otherwise changes to these classes may not be
> saved and reloaded correctly.
>
> See MCClassDefinitionTest.
>
> =============== Diff against Monticello-eem.671 ===============
>
> Item was changed:
> ----- Method: MCClassDefinition>>initializeWithName:
> superclassName:category:instVarNames:classVarNames:poolDictionaryNames:
> classInstVarNames:type:comment:commentStamp: (in category 'initializing')
> -----
> initializeWithName: nameString
> superclassName: superclassString
> category: categoryString
> instVarNames: ivarArray
> classVarNames: cvarArray
> poolDictionaryNames: poolArray
> classInstVarNames: civarArray
> type: typeSymbol
> comment: commentString
> commentStamp: stampStringOrNil
> name := nameString asSymbol.
> superclassName := superclassString ifNil: ['nil'] ifNotNil:
> [superclassString asSymbol].
> category := categoryString.
> + (self isCompiledCode: name) ifTrue: [type := #compiledMethod]
> ifFalse: [type := typeSymbol].
> - name = #CompiledMethod ifTrue: [type := #compiledMethod] ifFalse:
> [type := typeSymbol].
> comment := commentString withSqueakLineEndings.
> commentStamp := stampStringOrNil ifNil: [self defaultCommentStamp].
> variables := OrderedCollection new.
> self addVariables: ivarArray ofType: MCInstanceVariableDefinition.
> self addVariables: cvarArray sorted ofType:
> MCClassVariableDefinition.
> self addVariables: poolArray sorted ofType: MCPoolImportDefinition.
> self addVariables: civarArray ofType:
> MCClassInstanceVariableDefinition.!
>
> Item was changed:
> ----- Method: MCClassDefinition>>initializeWithName:superclassName:
> traitComposition:classTraitComposition:category:instVarNames:
> classVarNames:poolDictionaryNames:classInstVarNames:type:comment:commentStamp:
> (in category 'initializing') -----
> initializeWithName: nameString
> superclassName: superclassString
> traitComposition: traitCompositionString
> classTraitComposition: classTraitCompositionString
> category: categoryString
> instVarNames: ivarArray
> classVarNames: cvarArray
> poolDictionaryNames: poolArray
> classInstVarNames: civarArray
> type: typeSymbol
> comment: commentString
> commentStamp: stampStringOrNil
> name := nameString asSymbol.
> superclassName := superclassString ifNil: ['nil'] ifNotNil:
> [superclassString asSymbol].
> traitComposition := traitCompositionString.
> classTraitComposition := classTraitCompositionString.
> category := categoryString.
> + (self isCompiledCode: name) ifTrue: [type := #compiledMethod]
> ifFalse: [type := typeSymbol].
> - name = #CompiledMethod ifTrue: [type := #compiledMethod] ifFalse:
> [type := typeSymbol].
> comment := commentString withSqueakLineEndings.
> commentStamp := stampStringOrNil ifNil: [self defaultCommentStamp].
> variables := OrderedCollection new.
> self addVariables: ivarArray ofType: MCInstanceVariableDefinition.
> self addVariables: cvarArray sorted ofType:
> MCClassVariableDefinition.
> self addVariables: poolArray sorted ofType: MCPoolImportDefinition.
> self addVariables: civarArray ofType:
> MCClassInstanceVariableDefinition.!
>
> Item was added:
> + ----- Method: MCClassDefinition>>isCompiledCode: (in category
> 'initializing') -----
> + isCompiledCode: className
> + "Classes of type #compiledMethod are treated specially.
> CompiledCode
> + and all of its subclasses, including CompiledMethod, should have
> this
> + special type."
> +
> + CompiledCode
> + withAllSubclassesDo: [ :cls | (className = cls name)
> + ifTrue: [ ^true ]].
> + ^ false
> + !
>
I think that basing the type on the names of the subclasses of CompiledCode
is error prone. For example, loading a package in which CompiledCode did
/not/ have type #compiledMethod would result in an MCClassDefinition that
reflected the current system rather than the package.
I think the right thing is to base it on the the typeSymbol argument of
MCClassDefinition>>name:superclassName:[traitComposition:classTraitComposition:]category:instVarNames:classVarNames:poolDictionaryNames:classInstVarNames:type:comment:commentStamp:.
This should be #compiledMethod for CompiledCode and subclasses, derived
from Behavior>>typeOfClass. But you're explicitly using #bytes for this in
your mocks, as in:
MCClassDefinitionTest>>testKindOfSubclassForCompiledBlock
"CompiledCode and its subclasses are a special case."
| classDef |
"CompiledBlock should be like CompiledMethod, both now are subclassed from
CompiledCode"
classDef := self mockClass: #CompiledBlock super: #CompiledCode type:
#bytes.
self assert: #compiledMethod equals: classDef type.
self assert: CompiledBlock typeOfClass equals: classDef type.
Surely the correct thing here is
testKindOfSubclassForCompiledBlock
"CompiledCode and its subclasses are a special case."
| classDef |
"CompiledBlock should be like CompiledMethod, both now are subclassed from
CompiledCode"
classDef := self mockClass: #CompiledBlock super: #CompiledCode
type: CompiledBlock typeOfClass.
self assert: #compiledMethod equals: classDef type.
self assert: CompiledBlock typeOfClass equals: classDef type.
no?
It looks to me like the statement
name = #CompiledMethod ifTrue: [type := #compiledMethod] ifFalse:
[type := typeSymbol].
is an old hack for p[re-Spur which didn't bother to distinguish between
CompiledMethod and subclasses and #bytes classes such as ByteArray. But at
least since 1999 typeOfClass has answered #compiledMethod for
CompiledMethod-like classes.
So I propose to delete the line
(self isCompiledCode: name) ifTrue: [type := #compiledMethod]
ifFalse: [type := typeSymbol].
and change the mocks to use #compiledCode instead of #bytes. What do you
think?
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170809/2e946aeb/attachment.html>
More information about the Squeak-dev
mailing list
|