[squeak-dev] Order of evaluation bug with in lined to:do: in both Opal and Squeak compilers.

Levente Uzonyi leves at caesar.elte.hu
Fri Apr 21 22:44:10 UTC 2017


Actually it's possible to have one variable and one non-literal 
non-variable node where the latter changes the value of the former, so 
the condition should be:

 			(node isMessage
 				and: [ (#(to:do: to:by:do:) includes: node selector key)
 				and: [ node receiver isLiteralNode not
 				and: [ node arguments first isLiteralNode not
 				and: [ node receiver isVariableNode not
 					or: [ node arguments first isVariableNode not ] ] ] ] ])

Levente

On Sat, 22 Apr 2017, Levente Uzonyi wrote:

> This seems to work:
>
> methods := (SystemNavigation default allCallsOn: #to:do:) asSet.
> methods addAll: (SystemNavigation default allCallsOn: #to:by:do:).
> methods := CurrentReadOnlySourceFiles cacheDuring: [
> 	methods select: [ :methodReference |
> 		| ast found |
> 		ast := methodReference actualClass newParser parse: 
> methodReference sourceCode class: methodReference actualClass.
> 		found := nil.
> 		ast accept: (ParseNodeEnumerator ofBlock: [ :node |
> 			(node isMessage
> 				and: [ (#(to:do: to:by:do:) includes: node 
> selector key)
> 				and: [ node receiver isLiteralNode not
> 				and: [ node receiver isVariableNode not
> 				and: [ node arguments first isLiteralNode not
> 				and: [ node arguments first isVariableNode 
> not ] ] ] ] ])
> 				ifTrue: [ found := node ] ]).
> 		found notNil ] ].
> SystemNavigation default
> 	browseMessageList: methods sorted
> 	name: 'complex senders of to:do:'
> 	autoSelect: 'to:'.
>
> Levente
>
> On Sat, 22 Apr 2017, Nicolas Cellier wrote:
>
>> 
>> 
>> 2017-04-21 23:05 GMT+02:00 Nicolas Cellier 
>> <nicolas.cellier.aka.nice at gmail.com>:
>>       I see more than 1000 senders but most of them are in the style 1 to: 
>> ...
>> If any of receiver or 1st arg is a LiteralNode, no need to analyze, so it 
>> should be possible to write a small analyzer to select non trivial cases 
>> and review manually. Something like:
>> 
>> SystemNavigation default
>>     browseMessageList: ((SystemNavigation default allCallsOn: #to:do:) 
>> select: [:e |
>>         | ast found |
>>         ast := e actualClass newParser parse: e sourceCode class: e 
>> actualClass.
>>         found := nil.
>>         ast accept: (ParseNodeEnumerator
>>             ofBlock: [:node | ((node isKindOf: MessageNode)
>>                     and: [node selector key = #to:do:
>>                     and: [node receiver isLiteralNode not
>>                     and: [node arguments first isLiteralNode not]]])
>>                 ifTrue: [found := node]]).
>>         found notNil])
>>     name: 'complex senders of to:do:'
>>     autoSelect: true.
>> 
>> Above script did not find any complex senders though I see some, so I must 
>> have screwed something, but you get the idea.
>> 
>> Then there is the case of to:by:do: to analyze too.
>> 
>> 
>> Ah, my script failed because to:do: is transformed at this stage (disguised 
>> in #to:by:do:)...
>> 
>> SystemNavigation default
>>     browseMessageList: ((SystemNavigation default allCallsOn: #to:do:) 
>> select: [:e |
>>         | ast found |
>>         ast := e actualClass newParser parse: e sourceCode class: e 
>> actualClass.
>>         found := nil.
>>         ast accept: (ParseNodeEnumerator
>>             ofBlock: [:node | ((node isKindOf: MessageNode)
>>                     and: [(node selector key = #to:do: or: [node selector 
>> key = #to:by:do: ])
>>                     and: [node receiver isLiteralNode not
>>                     and: [node arguments first isLiteralNode not]]])
>>                 ifTrue: [found := node]]).
>>         found notNil])
>>     name: 'complex senders of to:do:'
>>     autoSelect: #to:do:
>>  
>> But I can't test other trivial cases when node arguments first 
>> isVariableNode, because it allways is after transform.
>> It would be necessary to disable transform during analysis...
>> 
>> 
>> 2017-04-21 16:08 GMT+02:00 Bert Freudenberg <bert at freudenbergs.de>:
>>       On Fri, Apr 21, 2017 at 1:56 AM, Eliot Miranda 
>> <eliot.miranda at gmail.com> wrote:
>>             On the order of evaluation bug, does anyone have any memory of 
>> which methods depended on this bug?
>> 
>> 
>> No idea ...
>> 
>> - Bert -
>> 
>> 
>> 
>> 
>> 
>> 
>


More information about the Squeak-dev mailing list