Thanks eliot, Clement,

but if the argument for to:do: is not an expression but one of the method
argument, this
transformation is not needed. Or still?




2015-11-20 8:31 GMT+01:00 Clément Bera <[email protected]>:

> You can use whileTrue: if it's a problem for you not to evaluate the limit
> at each iteration of the loop.
>

I don't need this. I just compared some compiled methods bytecodes after
the latest fix for the wrong frame size calculation.
For this, I compared opal compilers result with that of the old compiler.
And I noticed that some methods compiled with
opal had some "hidden" temps and couldn't explain way:)



>
> If you look at OrderedCollection for example, there are implemented
> differently in Pharo/VW and Squeak. Pharo and VW use to:do: whereas Squeak
> uses whileTrue: to iterate over the collection. Hence, if you remove
> elements from the OrderedCollection while iterating over it, the behavior
> is different.
>
>
> 2015-11-20 1:34 GMT+01:00 Eliot Miranda <[email protected]>:
>
>> Because were to:do: not inlined the expression passed as the to: actual
>> argument would be evaluated exactly once (bound to the formal argument for
>> to:) and so assigning to a temporary preserves the semantics in the most
>> direct way.  If the expression has side effects then those side effects
>> must occur only once.
>>
>> Note that were the to: expression merely another variable then the
>> compiler could only substitute the original variable if it's value could
>> not change, e.g. in
>>
>> exampleToDoArgumentLimitIsExpression
>>     | count sum |
>>     count := 10.
>>     sum := 0.
>>     1 to: count do: [ :each | sum := sum + each].
>>     ^sum
>>
>> It is ok to use count directly as the limit variable, but in this it is
>> not:
>>
>> exampleToDoArgumentLimitIsExpression
>>     | count sum |
>>     count := 10.
>>     sum := 0.
>>     1 to: count do: [ :each | sum := sum + each. count :=
>> #somethingElseEntirely].
>>     ^sum
>>
>> _,,,^..^,,,_ (phone)
>>
>> > On Nov 19, 2015, at 1:14 PM, Nicolai Hess <[email protected]>
>> wrote:
>> >
>> > What is the purpose of replacing expressions, used as limits in a
>> > to:do: call with by a new temporary variable?
>> >
>> > For example:
>> >
>> > OCOpalExamples>>#exampleToDoArgumentLimitIsExpression
>> > the code is
>> >
>> > exampleToDoArgumentLimitIsExpression
>> >     | count sum |
>> >     count := 10.
>> >     sum := 0.
>> >     1 to: count - 1 do: [ :each | sum := sum + each].
>> >     ^sum
>> >
>> > the decompiled bytecode :
>> >
>> > exampleToDoArgumentLimitIsExpression
>> >     | tmp1 tmp2 tmp3 |
>> >     tmp1 := 10.
>> >     tmp2 := 0.
>> >     tmp3 := tmp1 - 1.
>> >     1 to: tmp3 do: [ :tmp4 | tmp2 := tmp2 + tmp4 ].
>> >     ^ tmp2
>> >
>> > So, the expression (count - 1) in the to:do: loop is replaced by a new
>> > temporay (tmp3).
>> >
>> > Ok, but why ?
>>
>>
>

Reply via email to