[squeak-dev] The Trunk: Collections-eem.784.mcz
Levente Uzonyi
leves at caesar.elte.hu
Sat Mar 10 21:25:32 UTC 2018
When this methods was added, there was a debate whether it should be
optimized (inlined as you did) or not.
The argument behind the original implementation was that subclasses only
had to override #at:ifAbsent: to change the behavior of public lookup
methods #at:, #at:ifAbsent:, #at:ifPresent:, #at:ifPresent:ifAbsent: and
#at:ifAbsentPut:.
Since then #at:ifPresent:ifAbsentPut: was added, which didn't follow that
idea. I'm strongly against external packages subclassing collections
(exactly for this reason: it limits what core developer can do), so I have
no problem with these changes, but they may break some packages out there.
Levente
P.S.: Sometimes swapping the branches: #at:ifAbsent:ifPresent: would
improve code legibility, so perhaps that should be added as well.
P.P.S.: I think overall performance could be better if this were the main
method other variants were using if we want to follow that idea.
On Sat, 10 Mar 2018, commits at source.squeak.org wrote:
> Eliot Miranda uploaded a new version of Collections to project The Trunk:
> http://source.squeak.org/trunk/Collections-eem.784.mcz
>
> ==================== Summary ====================
>
> Name: Collections-eem.784
> Author: eem
> Time: 9 March 2018, 5:18:51.529302 pm
> UUID: 1862bd2e-3307-4973-b7b1-c8f6ad8d5f53
> Ancestors: Collections-ul.783
>
> Provide more efficient implementation(s) of at:ifPresent:ifAbsent: given impending use in the Compiler.
>
> =============== Diff against Collections-ul.783 ===============
>
> Item was changed:
> ----- Method: Dictionary>>at:ifPresent:ifAbsent: (in category 'accessing') -----
> at: key ifPresent: oneArgBlock ifAbsent: absentBlock
> + "Lookup the given key in the receiver. If it is present, answer the
> + value of evaluating the oneArgBlock with the value associated
> + with the key, otherwise answer the value of absentBlock."
> + ^(array at: (self scanFor: key))
> + ifNil: [absentBlock value]
> + ifNotNil: [:association| oneArgBlock value: association value]!
> - "Lookup the given key in the receiver. If it is present, answer the value of evaluating the oneArgBlock with the value associated with the key, otherwise answer the value of absentBlock."
> - self at: key ifPresent:[:v| ^oneArgBlock value: v].
> - ^absentBlock value!
>
> Item was added:
> + ----- Method: WeakIdentityDictionary>>at:ifPresent:ifAbsent: (in category 'accessing') -----
> + at: key ifPresent: oneArgBlock ifAbsent: absentBlock
> + "Lookup the given key in the receiver. If it is present, answer the
> + value of evaluating the oneArgBlock with the value associated
> + with the key, otherwise answer the value of absentBlock."
> + ^(array at: (self scanFor: key))
> + ifNil: [absentBlock value]
> + ifNotNil:
> + [:association|
> + association == vacuum
> + ifTrue: [absentBlock value]
> + ifFalse: [oneArgBlock value: association value]]!
More information about the Squeak-dev
mailing list
|