On Sun, Oct 16, 2011 at 10:09 AM, Nicolas Cellier <
[email protected]> wrote:

> Well, the inlined to:do: doesn't behave the same as non inlined one:
>
> |result|
> result := String new.
> 1 to: 10 do: [:n | result := result, n printString, ' '] yourself.
>
> --> 1
>
> The inlined byte code is explicitely returning nil (at byte 60)
>
> (Compiler new
>        compileNoPattern: '|result|
> result := String new.
> 1 to: 10 do: [:n | result := result, n printString, '' '']'
>        in: Object context: nil notifying: nil
>        ifFail: nil) generateWithTempNames.
>
>
> 37 <40> pushLit: String
> 38 <CC> send: new
> 39 <68> popIntoTemp: 0
> 40 <76> pushConstant: 1
> 41 <69> popIntoTemp: 1
> 42 <11> pushTemp: 1
> 43 <24> pushConstant: 10
> 44 <B4> send: <=
> 45 <AC 0D> jumpFalse: 60
> 47 <10> pushTemp: 0
> 48 <11> pushTemp: 1
> 49 <D2> send: printString
> 50 <E1> send: ,
> 51 <23> pushConstant: ' '
> 52 <E1> send: ,
> 53 <68> popIntoTemp: 0
> 54 <11> pushTemp: 1
> 55 <76> pushConstant: 1
> 56 <B0> send: +
> 57 <69> popIntoTemp: 1
> 58 <A3 EE> jumpTo: 42
> 60 <73> pushConstant: nil
> 61 <7C> returnTop
>
> Which return value would be useful?
>

That's not the right question.  IMO the compiler should answer the same
result as the non-inlined one when the return value is asked for.  Arguably
the non-inline version needs to be commented to specify that it returns the
value it does (in this case self), and that the compiler's optimiser
reflects this.


>
> Nicolas
>
> 2011/10/16 Stéphane Ducasse <[email protected]>:
> > A friend of mine ask me the following
> >
> > |result|
> > result := String new.
> > 1 to: 10 do: [:n | result := result, n printString, ' '].
> > I am trying to do or print this code. It prints 'nil' instead of a
> > collection. Its an example from PBE book.
> > do you know the reason?
> > although this one's working:
> > result := String new.
> > (1 to: 10) do: [:n | result := result, n printString, ' '].
> >
> > I checked the implementation
> > Interval>>do: aBlock
> > "Evaluate aBlock for each value of the interval.
> > Implementation note: instead of repeatedly incrementing the value
> > aValue := aValue + step.
> > until stop is reached,
> > We prefer to recompute value from start
> > aValue := start + (index * step).
> > This is better for floating points accuracy, while not degrading Integer
> and
> > Fraction speed too much.
> > Moreover, this is consistent with methods #at: and #size"
> > | aValue index size |
> > index := 0.
> > size := self size.
> > [index < size]
> > whileTrue: [aValue := start + (index * step).
> > index := index + 1.
> > aBlock value: aValue]
> >
> > Number>>to: stop do: aBlock
> > "Normally compiled in-line, and therefore not overridable.
> > Evaluate aBlock for each element of the interval (self to: stop by: 1)."
> > | nextValue |
> > nextValue := self.
> > [nextValue <= stop]
> > whileTrue:
> > [aBlock value: nextValue.
> > nextValue := nextValue + 1]
> >
> > any further idea than := value is different from value:
> > Stef
>
>


-- 
best,
Eliot

Reply via email to