|
From: | Paolo Bonzini |
Subject: | [Help-smalltalk] Re: Error while trying to write numbers in words |
Date: | Mon, 14 Jul 2008 11:18:23 +0200 |
User-agent: | Thunderbird 2.0.0.14 (Macintosh/20080421) |
Paolo Bonzini wrote:
Olivier Blanc wrote:Hi Paolo, I couldn't find a way to point out where the bug is appearing. How do you trace it down ?I modified a little the code (just to make it more similar to my Smalltalk coding style), and got a "stack height mismatch", which hints to a bug in the compiler.
In the bytecode optimizer, more precisely. The optimization of jumps-to-jumps was causing a jump with a small range (<256 bytes) to become a jump with a large range (>256 bytes), and the optimizer was truncating the jump.
I fixed this in 43baff3b8586cae9cb505e8d3bc43c7915d4aa28 by more or less rewriting the bytecode optimizer (_gst_optimize_bytecodes).
Then I noticed a speedup opportunity, because the optimizer was not generating a few bytecodes that are in the bytecode set. These are "compound" bytecodes such as this one
101 = bytecode bc101 { PREFETCH (); DUP_STACK_TOP (); POP_JUMP_FALSE (arg); } (used in compiling #and: and #or: messages), this one 165 = bytecode bc165 { PREFETCH (); NOT_NIL_SPECIAL (); POP_JUMP_FALSE (arg); } (resulting from "a notNil ifTrue: [...]"), and this one 134 = bytecode bc134 { ADVANCE (); POP_STACK_TOP (); JUMP_BACK (arg); }(used in compiling #whileTrue: and #whileFalse: messages). Generation of these bytecodes is now done, after these three commits:
- 9bc2bf594fd75b4bbc02f4a13b421f545d507880 (a bug fix in the printing of CompiledMethods)
- 18c63d0a2fcb677f176c30dd933366172f81a328 (bugs in the implementation of the bytecodes that went unnoticed until now)
- 5aa9ebc511af8bd0615d3fb9e10198d145c22098 (actual generation of the bytecodes in the optimizer)
I applied all four patches to the 3.0 branch too. Should there be problems, on the branch I might revert the last one or two.
Paolo
[Prev in Thread] | Current Thread | [Next in Thread] |