[squeak-dev] The Trunk: Monticello-dtl.682.mcz

Levente Uzonyi leves at caesar.elte.hu
Mon May 14 00:42:06 UTC 2018


Yes, I would revert those changes. If a proxy doesn't want to forward a
message, it can just implement the method. If you want direct access to 
the proxy object, you can use the mirror primitives.

Levente

On Sun, 13 May 2018, David T. Lewis wrote:

> Thanks Levente,
>
> Indeed that is a much simpler solution. The fact that the selector refers
> to "hashBlock" and "equalBlock" should have been a clue, thank you for
> pointing it out.
>
> Should I revert the changes? In testPerformIdentityEquals I wrote this:
>
> 	"Selector #== must refer to aProtoObj, not to the MCPackage to which it delegates"
> 	self assert: [aProtoObj perform: #== with: aProtoObj]
> 		description: 'If aProtoObj delegates to the MCPackage the identity test will fail'.
>
> because I expected that identity test should always refer to the actual receiver
> object, but maybe that is no the right assumption in the case of proxies.
>
> Dave
>
>
> On Mon, May 14, 2018 at 01:52:14AM +0200, Levente Uzonyi wrote:
>> Having a look at the code, it's probably enough to change 
>> #newLargeIdentityDictionaryOfSize: to be
>>
>> 	^(PluggableDictionary new: size)
>> 		hashBlock: [ :object | object largeHash ];
>> 		equalBlock: [ :a :b | a == b ];
>> 		yourself
>> 
>> That change should also make the code somewhat faster.
>> 
>> Levente
>> 
>> On Mon, 14 May 2018, Levente Uzonyi wrote:
>> 
>> >Hi Dave,
>> >
>> >I think the best would be if SystemTracer used the mirror primitives (See 
>> >Context's mirror primitives method category), primitive 110 
>> >(#object:eqeq:) in this case, so that proxies like MCPackageInEnvironment 
>> >can't affect it.
>> >
>> >Levente
>> >
>> >On Sun, 13 May 2018, David T. Lewis wrote:
>> >
>> >>This update feels a bit hacky to me with its test for a specific 
>> >>selector, 
>> >so
>> >>better or clearer solutions are welcome. Meanwhile, the prior behavior was
>> >>corrupting identity dictionaries, which seems like a Bad Thing, so I put
>> >>this fix (along with a new unit test) directly into trunk.
>> >>
>> >>The problem showed up as I was trying to get SystemTracer64 working again 
>> >on
>> >>V3 images, so it was not an easy thing to debug :-/
>> >>
>> >>Dave
>> >>
>> >>On Sun, May 13, 2018 at 11:14:39PM +0000, commits at source.squeak.org wrote:
>> >>>David T. Lewis uploaded a new version of Monticello to project The Trunk:
>> >>>http://source.squeak.org/trunk/Monticello-dtl.682.mcz
>> >>>
>> >>>==================== Summary ====================
>> >>>
>> >>>Name: Monticello-dtl.682
>> >>>Author: dtl
>> >>>Time: 13 May 2018, 7:14:27.068827 pm
>> >>>UUID: 76fc84e6-7e2b-4a6a-af6b-2d02d11c38eb
>> >>>Ancestors: Monticello-nice.681
>> >>>
>> >>>Sending perform: #== with: anObject to an instance of 
>> >MCPackageInEnvironment should test identity of the actual instance, not 
>> >the MCPackage to which it refers. If this is not so, a PluggableDictionary 
>> >will fail when doing identity checks on its keys, as is the case for a 
>> >SystemTracer adding all objects to its oop dictionary.
>> >>>
>> >>>Implement MCPackageInEnvironment>>perform:with: such that performing #== 
>> >will call primitivePerform, and all other selectors are delegated to the 
>> >MCPackage as before.
>> >>>
>> >>>=============== Diff against Monticello-nice.681 ===============
>> >>>
>> >>>Item was added:
>> >>>+ ----- Method: MCPackageInEnvironment>>perform:with: (in category 
>> >'delegating') -----
>> >>>+ perform: aSymbol with: anObject
>> >>>+ 	"If aSymbol is #== then the sender is trying to perform an identity 
>> >comparison.
>> >>>+ 	This cannot be delegated, because the delegate will be a different 
>> >object.
>> >>>+ 	Implement perform:with: here to protect for this case. An important 
>> >example
>> >>>+ 	is the case of PluggableDictionary, which relies on perform:with: to 
>> >implement
>> >>>+ 	comparisons for an identity dictionary."
>> >>>+ 
>> >>>+ 	aSymbol == #==
>> >>>+ 		ifTrue: [ ^self privatePerform: aSymbol with: anObject ]
>> >>>+ 		ifFalse: [ ^package perform: aSymbol with: anObject "as per 
>> >doesNotUnderStand:" ]
>> >>>+ !
>> >>>
>> >>>Item was added:
>> >>>+ ----- Method: MCPackageInEnvironment>>privatePerform:with: (in 
>> >>>category 
>> >'delegating') -----
>> >>>+ privatePerform: aSymbol with: anObject
>> >>>+ 	"aSymbol is #== and the sender is trying to perform an identity 
>> >comparison.
>> >>>+ 	Invoke primitivePerform."
>> >>>+ 
>> >>>+ 	<primitive: 83>
>> >>>+ 	^ self primitiveFailed!
>> >>>
>> >>>
>> >
>> >
>>


More information about the Squeak-dev mailing list