Re: The Trunk: Environments-cwp.43.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Environments-cwp.43.mcz

Nicolas Cellier



2014-01-03 21:58 GMT+01:00 <[hidden email]>:
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>

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.
+ '!





Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Environments-cwp.43.mcz

Nicolas Cellier



2014-05-26 23:19 GMT+02:00 Nicolas Cellier <[hidden email]>:



2014-01-03 21:58 GMT+01:00 <[hidden email]>:

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...


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.
+ '!






Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Environments-cwp.43.mcz

Nicolas Cellier



2014-05-26 23:26 GMT+02:00 Nicolas Cellier <[hidden email]>:



2014-05-26 23:19 GMT+02:00 Nicolas Cellier <[hidden email]>:




2014-01-03 21:58 GMT+01:00 <[hidden email]>:

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.
+ '!