[squeak-dev] The Trunk: Monticello-dtl.672.mcz

Eliot Miranda eliot.miranda at gmail.com
Wed Aug 9 17:09:57 UTC 2017


Hi David,

    I saved the proposed changes to inbox

On Wed, Aug 9, 2017 at 9:58 AM, Eliot Miranda <eliot.miranda at gmail.com>
wrote:

>
>
> On Wed, Aug 9, 2017 at 9:52 AM, Eliot Miranda <eliot.miranda at gmail.com>
> wrote:
>
>> 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>>initializeW
>>> ithName: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>>initializeW
>>> ithName:superclassName:traitComposition:classTraitCompositio
>>> n:category:instVarNames:classVarNames:poolDictionaryNames:cl
>>> assInstVarNames: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:cla
>> ssTraitComposition:]category:instVarNames:classVarNames:poo
>> lDictionaryNames: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].
>>
>
> Oops, I mean replace it with
>
> type := typeSymbol.
>
> and change the mocks to use #compiledCode instead of #bytes.  What do you
>> think?
>>
>> _,,,^..^,,,_
>> best, Eliot
>>
>
>
>
> --
> _,,,^..^,,,_
> best, Eliot
>



-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170809/d7244c01/attachment.html>


More information about the Squeak-dev mailing list