On Tue, Jan 13, 2009 at 2:15 AM, Martin Beck <martin.beck@hpi.uni-potsdam.de
wrote:
Igor Stasenko wrote:
2009/1/12 nicolas cellier ncellier@ifrance.com:
Following cascading of macros, I need turning some inline off. A
recurrent
topic in Squeak-dev.
Well, once i thought about using a Compiler reflective annotation (i.e.
a
pragma) in order to turn optimization off.
Stupid me. Inlined messages are made of block receiver/arguments. So one would simply turn inlining off by sending a yourself message to a block.
[false] yourself whileTrue. false ifTrue: [self inspect] yourself.
Of course, yourself is not a very explicit message... We could create another #turnOffInlining or something...
Except that in Squeak as other Smalltalks, the Old Compiler is quite pedantic about optimizing these messages.
[false] yourself <- receiver of whileTrue must be a block or variable ->whileTrue.
false ifTrue: [self inspect] <- argument of ifTrue: must be a block or variable ->yourself.
Common! You don't like the system? Change It! This is just 1 method attached.
Heh.. you seem stumbled upon same things as i was :)
well, if you writing own code so you have a total control whether you want inlining or not, you can simply write: [ ... ] perform: #whileTrue
But keep in mind, that (at least in my Squeak 3.10 image) BlockContext>>whileTrue: is defined recursively:
whileTrue: aBlock ^ [self value] whileTrue: [aBlock value]
(Oops, too early in the morning)
this definition works correctly:
whileTrue: aBlock ^self value ifTrue: [self whileTrue: aBlock]
Thus, you still get inlined code somewhere. However, this can be changed to use BlockContext>>restart, I think...
Regards, Martin