[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] Re: Error while trying to write numbers in words

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 (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 ();
    POP_JUMP_FALSE (arg);

(used in compiling #and: and #or: messages), this one

  165 = bytecode bc165 {
    PREFETCH ();
    POP_JUMP_FALSE (arg);

(resulting from "a notNil ifTrue: [...]"), and this one

  134 = bytecode bc134 {
    ADVANCE ();
    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.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]