[squeak-dev] The Trunk: Compiler-nice.224.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Feb 20 21:56:51 UTC 2012
Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-nice.224.mcz
==================== Summary ====================
Name: Compiler-nice.224
Author: nice
Time: 20 February 2012, 10:56:20.223 pm
UUID: 15070f34-9c69-4407-a041-7659522fc95a
Ancestors: Compiler-nice.223
Just for fun, fix http://code.google.com/p/pharo/issues/detail?id=4915
The inlined and non inlined versions of to:do: should answer the same result.
Implementation notes:
This happens to be the receiver of to:do:, and thus the initial value of the loop index.
So we can trivially
- push the value of init statement on the stack,
- remove the final nil that was pushed forValue,
- and leave the rest of code generation unchanged
=============== Diff against Compiler-nice.223 ===============
Item was changed:
----- Method: MessageNode>>emitCodeForToDo:encoder:value: (in category 'code generation') -----
emitCodeForToDo: stack encoder: encoder value: forValue
" var := rcvr. L1: [var <= arg1] Bfp(L2) [block body. var := var + inc] Jmp(L1) L2: "
| loopSize initStmt limitInit test block incStmt blockSize |
initStmt := arguments at: 4.
limitInit := arguments at: 7.
test := arguments at: 5.
block := arguments at: 3.
incStmt := arguments at: 6.
blockSize := sizes at: 1.
loopSize := sizes at: 2.
limitInit == nil
ifFalse: [limitInit emitCodeForEffect: stack encoder: encoder].
+
+ "This will return the receiver of to:do: which is the initial value of the loop"
+ forValue
+ ifTrue: [initStmt emitCodeForValue: stack encoder: encoder.]
+ ifFalse: [initStmt emitCodeForEffect: stack encoder: encoder].
- initStmt emitCodeForEffect: stack encoder: encoder.
test emitCodeForValue: stack encoder: encoder.
self emitCodeForBranchOn: false dist: blockSize pop: stack encoder: encoder.
pc := encoder methodStreamPosition.
block emitCodeForEvaluatedEffect: stack encoder: encoder.
incStmt emitCodeForEffect: stack encoder: encoder.
+ self emitCodeForJump: 0 - loopSize encoder: encoder.!
- self emitCodeForJump: 0 - loopSize encoder: encoder.
- forValue ifTrue: [encoder genPushSpecialLiteral: nil. stack push: 1]!
Item was changed:
----- Method: MessageNode>>sizeCodeForToDo:value: (in category 'code generation') -----
sizeCodeForToDo: encoder value: forValue
" var := rcvr. L1: [var <= arg1] Bfp(L2) [block body. var := var + inc] Jmp(L1) L2: "
| loopSize initStmt test block incStmt blockSize initSize limitInit |
block := arguments at: 3.
initStmt := arguments at: 4.
test := arguments at: 5.
incStmt := arguments at: 6.
limitInit := arguments at: 7.
+ initSize := forValue
+ ifTrue: [initStmt sizeCodeForValue: encoder.]
+ ifFalse: [initStmt sizeCodeForEffect: encoder].
- initSize := initStmt sizeCodeForEffect: encoder.
limitInit == nil ifFalse:
[initSize := initSize + (limitInit sizeCodeForEffect: encoder)].
blockSize := (block sizeCodeForEvaluatedEffect: encoder)
+ (incStmt sizeCodeForEffect: encoder)
+ (encoder sizeJumpLong: -1).
loopSize := (test sizeCodeForValue: encoder)
+ (self sizeCode: encoder forBranchOn: false dist: blockSize)
+ blockSize.
sizes := Array with: blockSize with: loopSize.
^initSize
+ + loopSize!
- + loopSize
- + (forValue ifTrue: [encoder sizePushSpecialLiteral: nil] ifFalse: [0])!
More information about the Squeak-dev
mailing list
|