A possible solution: Make stopConditions an object with inst vars 'stops crossedX endOfRun'. Then replace (stops at: CrossedX) with: (stops crossedX) in CharacterScanner and friends. Default initialization would be crossedX := #crossedX. endOfRun := #endOfRun. It only costs and indirection when executing (stops at: asciiValue + 1). (Remember this part has to be fast).
By the way, did you notice the mess between inst var stopConditions and argument stops? This is http://bugs.squeak.org/view.php?id=6450
2009/4/17 Eliot Miranda eliot.miranda@gmail.com:
On Thu, Apr 16, 2009 at 2:52 PM, Andrey Larionov anlarionov@gmail.com wrote:
Sorry for hestiating, but since Unicode is come and Character ranges are enlarged, should we review this hardcodes?
Of course I was only trying to answer what they were used for. not suggesting they should continue to be used that way.
On Fri, Apr 17, 2009 at 01:09, Eliot Miranda eliot.miranda@gmail.com wrote:
On Thu, Apr 16, 2009 at 1:05 PM, Andrey Larionov anlarionov@gmail.com wrote:
Investigating reasons of fail FontTest tests i found bug in MultiCompositionScaner (or it maybe some related class). Looks like what Character value: 257 had a special meaning in squeak.
257 was the code THE scan characters primitive answered when it reached the end of the input string. 258 was the code it returned when the next character to be output would have crOssed over the right-hand margin. Alas none of this is documented in the blue book. You have to extract it from e.g. the Xerox V2.0 sources. Here's the defines from an ancient VM of mine: /* TextConstants pool variables initialised in Text */ #define CrossedX 258 #define EndOfRun 257
If not use StrikeFont everything is well, but if you choose FreeType font the doing something (Character value: 257) asString asTextMorph openInWorld creates an endles loop in composer. It founds character falls in crossedX method (this character is stopCondition) and then remove character from composition and starts again.