[squeak-dev] The Trunk: Environments-cwp.43.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Mon May 26 22:31:37 UTC 2014


2014-05-26 23:26 GMT+02:00 Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com>:

>
>
>
> 2014-05-26 23:19 GMT+02:00 Nicolas Cellier <
> nicolas.cellier.aka.nice at gmail.com>:
>
>
>>
>>
>> 2014-01-03 21:58 GMT+01:00 <commits at source.squeak.org>:
>>
>> Colin Putney uploaded a new version of Environments to project The Trunk:
>>> http://source.squeak.org/trunk/Environments-cwp.43.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: Environments-cwp.43
>>> Author: cwp
>>> Time: 1 January 2014, 1:27:27.436 pm
>>> UUID: 3ccd33e2-0400-405d-b213-fc170cf0a3e6
>>> Ancestors: Environments-cwp.42
>>>
>>> Rewrite import/export to be eager, rather than lazy. (step 1 of 3)
>>>
>>> =============== Diff against Environments-cwp.42 ===============
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy class>>namespace: (in category 'create')
>>> -----
>>> - namespace: aDictionary
>>> -       ^ self namespace: aDictionary next: nil!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy class>>namespace:next: (in category
>>> 'create') -----
>>> - namespace: aDictionary next: anImport
>>> -       ^ self
>>> -               namespace: aDictionary
>>> -               policy: AllNamePolicy new
>>> -               next: anImport!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy class>>namespace:policy: (in category
>>> 'create') -----
>>> - namespace: aDictionary policy: aNamePolicy
>>> -       ^ self
>>> -               namespace: aDictionary
>>> -               policy: aNamePolicy
>>> -               next: nil!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy class>>namespace:policy:next: (in category
>>> 'create') -----
>>> - namespace: aDictionary policy: aNamePolicy next: anImport
>>> -       ^ self new
>>> -               initializeWithNamespace: aDictionary
>>> -               policy: aNamePolicy
>>> -               next: anImport!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy class>>null (in category 'create') -----
>>> - null
>>> -       ^ self namespace: IdentityDictionary new!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy>>forgetName: (in category 'private') -----
>>> - forgetName: aSymbol
>>> -       self name: aSymbol do: [:foreign |
>>> -               namespace removeKey: foreign ifAbsent: [
>>> -                       next ifNotNil: [next forgetName: aSymbol]]].!
>>>
>>> Item was removed:
>>> - ----- Method: BindingPolicy>>initializeWithNamespace:policy:next: (in
>>> category 'initialize-release') -----
>>> - initializeWithNamespace: aDictionary policy: aNamePolicy next: anImport
>>> -       namespace := aDictionary.
>>> -       policy := aNamePolicy.
>>> -       next := anImport!
>>>
>>> Item was changed:
>>>   Object subclass: #Environment
>>> +       instanceVariableNames: 'info declarations bindings undeclared
>>> policies observers'
>>> -       instanceVariableNames: 'info imports exports declarations
>>> references public undeclared bindings policies observers'
>>>         classVariableNames: 'Default Instances'
>>>         poolDictionaries: ''
>>>         category: 'Environments-Core'!
>>>
>>>   !Environment commentStamp: 'cmm 12/20/2013 14:10' prior: 0!
>>>   I am a context for compiling methods. I maintain the namespace of
>>> classes and global variables that are visible to the methods compiled
>>> within me.
>>>
>>>   I have the following instance variables:
>>>
>>>   info <EnvironmentInfo>
>>>   Metadata about me and the code I contain.
>>>
>>>   imports <Import>
>>>   Rules for importing globals from other environments.
>>>
>>>   exports <Export>
>>>   Rules for exposing globals to other environments.
>>>
>>>   declarations <IdentityDictionary>
>>>   Bindings for globals that have been declared inside me.
>>>
>>>   references      <IdentityDictionary>
>>>   Bindings for globals that are used by methods compiled inside me.
>>>
>>>   public <IdentityDictionary>
>>>   Bindings for classes that have been declared inside me, and which
>>> satisfy the export rules contain in 'exports'.
>>>
>>>   undeclared      <Dictionary>
>>>   Bindings for globals that are used by methods compiled inside me, but
>>> which aren't present in 'references' and couldn't be found via the rules in
>>> 'imports'.!
>>>
>>>
>> <rant>
>> Hmm, the change of Environment definition would have deserved an update
>> of Environment comment...
>>
>> Some senders of bindingOf: are currently not working (see
>> MCEnvironmentLoadTest), though they once did.
>> This is because bindingOf: uses bindings inst var which is left empty by
>> #testLoadIntoEnvironment.
>> This inst var is not documented and it's not obvious to guess its purpose.
>> It seems that declarations are filled, so I should probably use
>> declarationOf: instead of bindingOf:
>> But that's a blind guess, that means that I change code without
>> understanding the details, and that ain't good.
>>
>> If I want to understand, I will have to open many browsers on senders
>> chains, tests, etc...
>> instead of reading a simple comment.
>> And if I want to review the senders of bindingOf:ifAbsent: / bindingOf:
>> then good luck...
>>
>> Very few will be writing Environment code.
>> Many will read it.
>> My feeling as a reader is that the writers have lack of empathy with the
>> readers.
>>
>> Maybe I'm dumb, but I like to be dumb.
>> Being smart costs too much energy, and in my experience, the smarter the
>> code, the merrier the missinterpretations (that is the bugs).
>>
>> </rant>
>>
>>
> I'm also puzzled because currently #hasBindingOf: bases its results on
> declarations, while #bindingOf: bases its results on bindings, so they kind
> of disagree.
> When the name does not tell, it's probably better to change the name, or
> at least to comment a bit...
>
>
The answer would be: #testInternalVisibility

The own declarations are not visible in an Environment, unless it
importSelf...
Then the bindings will include the declarations (plus some other bindings
imported from some other environments).

hasBindingOf: should check declarations because it means that this is the
primary environment of the global
Environment allInstancesDo: [:anEnvironment | anEnvironment
allClassesAndTraitsDo: [:aClass | self assert: aClass environment ==
anEnvironment]].

I still do not understand why associationAt: ask the declarations, while
associationOrUndeclaredAt: asks the bindings, but there are flag: #review,
so I'm not alone (many messages emulating old Dictionary or SmalltalkImage
protocols should be reviewed too anyway).


>
>  Item was removed:
>>> - ----- Method: Environment>>migrate (in category 'initialize-release')
>>> -----
>>> - migrate
>>> -       | newDeclarations source dest index policy |
>>> -       bindings := IdentityDictionary new.
>>> -       newDeclarations := IdentityDictionary new.
>>> -       source := Array new: declarations size.
>>> -       dest := Array new: declarations size.
>>> -       index := 1.
>>> -       declarations associationsDo:
>>> -               [:ea || binding |
>>> -               binding := ea key => ea value.
>>> -               source at: index put: ea.
>>> -               dest at: index put: binding.
>>> -               newDeclarations add: binding.
>>> -               bindings add: binding.
>>> -               index := index + 1].
>>> -       declarations := newDeclarations.
>>> -       source elementsForwardIdentityTo: dest.
>>> -
>>> -       policy := BindingPolicy
>>> -               environment: self
>>> -               policy: AllNamePolicy new
>>> -               addSelector: #showBinding:
>>> -               removeSelector: #hideBinding:.
>>> -       policies := Array with: policy.
>>> -
>>> -       observers := IdentitySet new..
>>> -       !
>>>
>>> Item was removed:
>>> - ----- Method: Environment>>public (in category 'accessing') -----
>>> - public
>>> -       ^ public!
>>>
>>> Item was removed:
>>> - ----- Method: Environment>>publicizeContents (in category 'private')
>>> -----
>>> - publicizeContents
>>> -       declarations associationsDo: [:binding | exports bind: binding].
>>> - !
>>>
>>> Item was removed:
>>> - ----- Method: Environment>>rebindUndeclared (in category 'private')
>>> -----
>>> - rebindUndeclared
>>> -       undeclared keys do:
>>> -               [:name |
>>> -               (imports valueOf: name) ifNotNil:
>>> -                       [:v |
>>> -                       references declare: name from: undeclared.
>>> -                       references at: name put: v]]!
>>>
>>> Item was removed:
>>> - BindingPolicy subclass: #Export
>>> -       instanceVariableNames: ''
>>> -       classVariableNames: ''
>>> -       poolDictionaries: ''
>>> -       category: 'Environments-Policies'!
>>>
>>> Item was removed:
>>> - ----- Method: Export>>bind: (in category 'binding') -----
>>> - bind: aBinding
>>> -
>>> -       self name: aBinding key do:
>>> -               [:foreign | ^ namespace add: (aBinding asBinding:
>>> foreign)].
>>> -       ^ next ifNotNil: [next bind: aBinding]!
>>>
>>> Item was removed:
>>> - ----- Method: Export>>bind:to: (in category 'binding') -----
>>> - bind: aSymbol to: anObject
>>> -       ^ self bind: aSymbol -> anObject!
>>>
>>> Item was removed:
>>> - BindingPolicy subclass: #Import
>>> -       instanceVariableNames: ''
>>> -       classVariableNames: ''
>>> -       poolDictionaries: ''
>>> -       category: 'Environments-Policies'!
>>>
>>> Item was removed:
>>> - ----- Method: Import>>bindingOf: (in category 'binding') -----
>>> - bindingOf: aSymbol
>>> -       self name: aSymbol do:
>>> -               [:foreign |
>>> -               ^ namespace
>>> -                       associationAt: foreign
>>> -                       ifAbsent: [next ifNotNil: [next bindingOf:
>>> aSymbol]]].
>>> -       ^ next ifNotNil: [next bindingOf: aSymbol]!
>>>
>>> Item was removed:
>>> - ----- Method: Import>>valueOf: (in category 'binding') -----
>>> - valueOf: aSymbol
>>> -       ^ (self bindingOf: aSymbol) value!
>>>
>>> Item was added:
>>> + (PackageInfo named: 'Environments') postscript: '"Recompile all
>>> methods to fix errant bindings"
>>> + Compiler recompileAll.
>>> + '!
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20140527/8d160d1a/attachment.htm


More information about the Squeak-dev mailing list