[squeak-dev] The Trunk: Collections-ul.564.mcz

Chris Muller asqueaker at gmail.com
Mon Feb 3 16:58:11 UTC 2014


Well, I don't much like it.  Remember our discussion a couple of
months ago, we were wondering whether LRUCache was even useful at all?
 Granted, Levente said the prior _implementation_ was not useful,
which he addressed with this new one.

But now what was once a simple and fast check in Array>>#isLiteral now
allocates an IdentityDictionary every time, just to accomodate this
strange implementation of LRUCache.

And still leaves open other potential infinite-recursions.

So, I see this as having some of the same properties as the effing
MCInfoProxy's in that we may find we need to patch Array (!!) at some
point in the future again -- If any other method besides #isLiteral in
Array, ArrayedCollection, SequenceableCollection, Collection, Object,
or ProtoObject happens to invoke a recursive function like #isLiteral
did, we're hosed.  (and yet, no complaints from anyone in the
community, hmm how ironic..)


On Mon, Feb 3, 2014 at 10:28 AM, Frank Shearar <frank.shearar at gmail.com> wrote:
> On 3 February 2014 16:18,  <commits at source.squeak.org> wrote:
>> Chris Muller uploaded a new version of Collections to project The Trunk:
>> http://source.squeak.org/trunk/Collections-ul.564.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Collections-ul.564
>> Author: ul
>> Time: 3 February 2014, 2:35:36.802 pm
>> UUID: 4b9a37ef-df86-40a0-a0dd-8e8b2c04d4ed
>> Ancestors: Collections-ul.563
>>
>> Make sure that Array >> #isLiteral won't get into an infinite recursion, even if the receiver has an recursive structure.
>>
>> =============== Diff against Collections-ul.563 ===============
>>
>> Item was changed:
>>   ----- Method: Array>>isLiteral (in category 'testing') -----
>>   isLiteral
>> +
>> +       ^self class == Array and: [
>> +               self isLiteralIfContainedBy: IdentitySet new ]!
>> -       ^self class == Array and: [self allSatisfy: [:each | each isLiteral]]!
>>
>> Item was added:
>> + ----- Method: Array>>isLiteralIfContainedBy: (in category 'testing') -----
>> + isLiteralIfContainedBy: parents
>> +       " Answer whether the receiver has a literal text form recognized by the compiler. Precondition: the receiver is an instance of Array. "
>> +
>> +       (parents includes: self) ifTrue: [ ^false ].
>> +       parents add: self.
>> +       1 to: self size do: [ :index |
>> +               | element |
>> +               element := self at: index.
>> +               (element class == Array
>> +                       ifTrue: [ element isLiteralIfContainedBy: parents ]
>> +                       ifFalse: [ element isLiteral ]) ifFalse: [ ^false ] ].
>> +       parents remove: self.
>> +       ^true!
>
> +1
>
> frank
>


More information about the Squeak-dev mailing list