[squeak-dev] The Trunk: Kernel-ul.709.mcz

Frank Shearar frank.shearar at gmail.com
Wed Sep 5 09:42:12 UTC 2012


On 4 September 2012 18:03, Frank Shearar <frank.shearar at gmail.com> wrote:
> On 4 September 2012 15:25, Levente Uzonyi <leves at elte.hu> wrote:
>> On Tue, 4 Sep 2012, Frank Shearar wrote:
>>
>>> On 4 September 2012 14:37, Levente Uzonyi <leves at elte.hu> wrote:
>>>>
>>>> On Tue, 4 Sep 2012, Frank Shearar wrote:
>>>>
>>>>> On 4 September 2012 00:06,  <commits at source.squeak.org> wrote:
>>>>>>
>>>>>>
>>>>>> Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
>>>>>> Item was added:
>>>>>> + ----- Method: Process>>environmentAt:ifAbsentPut: (in category
>>>>>> 'process
>>>>>> specific') -----
>>>>>> + environmentAt: key ifAbsentPut: aBlock
>>>>>> +
>>>>>> +       ^(env ifNil: [ env := Dictionary new ]) at: key ifAbsentPut:
>>>>>> aBlock.!
>>>>>
>>>>>
>>>>>
>>>>> Given that Process >> #environmentAt:put: says "^ (env ifNil: [ env :=
>>>>> Dictionary new ]) at: key put: value" wouldn't it be better to defer
>>>>> the dictionary creation to it, or pull the two initialisation places
>>>>> into one, separate, place?
>>>>
>>>>
>>>>
>>>> There are three things to consider:
>>>> - do we want to expose the dictionary itself?
>>>> - performance
>>>> - single initialization point
>>>>
>>>> I picked the implementation with better performance and didn't want to
>>>> expose the dictionary. We can also have a single initialization point but
>>>> the code looks a bit unusual (at least to me):
>>>>
>>>> Process >> #ensureEnvironment
>>>>
>>>>
>>>>         env ifNil: [ env := Dictionary new ]
>>>>
>>>> Process >> #environmentAt: key put: value
>>>>
>>>>         env ifNil: [ self ensureEnvironment ].
>>>>         ^env at: key put: value
>>>>
>>>> Process >> #environmentAt: key ifAbsentPut: aBlock
>>>>
>>>>         env ifNil: [ self ensureEnvironment ].
>>>>         ^env at: key ifAbsentPut: aBlock
>>>>
>>>> I can push a new version if you like this implementation more.
>>>
>>>
>>> I suppose using a method that does the initialisation's too much of a
>>> hit? Having a #environment that said "^ env ifNil: []" would be too
>>> expensive?
>>
>>
>> No, but it would expose the environment dictionary and would make all these
>> methods pointless.
>
> Surely noone ever uses methods marked private!

OK, so how about pushing the env ifNil: [] into ensure? Do you think
this would look a bit less weird?:

Process >> #environmentAt: key ifAbsentPut: aBlock

        self ensureEnvironment.
        ^env at: key ifAbsentPut: aBlock

I dislike the necessity to remember to "self ensureEnvironment" before
any access of env, but I take your point regarding exposing the
dictionary.

frank
>
> frank
>
>> Levente
>>
>>
>>>
>>> frank
>>>
>>>> Levente
>>>>
>>>>
>>>>>
>>>>> frank
>>>>>
>>>>>> Item was added:
>>>>>> + ----- Method: ProtoObject>>pointsOnlyWeaklyTo: (in category
>>>>>> 'tracing')
>>>>>> -----
>>>>>> + pointsOnlyWeaklyTo: anObject
>>>>>> +       "Assume, we already know that receiver points to an object,
>>>>>> answer true if receiver points only weakly to it."
>>>>>> +
>>>>>> +       self class isWeak ifFalse: [ ^false ].
>>>>>> +       1 to: self class instSize do: [ :i |
>>>>>> +               (self instVarAt: i) == anObject ifTrue: [ ^false ] ].
>>>>>> +       ^true!
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>


More information about the Squeak-dev mailing list