weird breakage in 3.9. Am I in the Twilight Zone?

Kragen Javier Sitaker kragen at pobox.com
Sun Dec 16 03:29:07 UTC 2007


So I was playing with Squeak 3.9, walking through the stuff in Squeak
By Example (which is terrific, by the way).  Turns out
StringTest>>#testIndexOf is failing, because it asserts that 'abc-'
asWideString indexOfAnyOf: (CharacterSet newFrom: ' -0123456789')
should be 4, and instead it's 0.

Well, String>>#findFirstInString:inSet:startingAt: works by iterating
over the string to find either an object in the set or the end of the
string (literally, there are two tests in the whileTrue: condition)
and then checking after the end of the loop to see if the loop counter
got to the last character.  Well, that approach is not going to work;
it can't tell whether it got to the last character and then found that
it was in the set, or instead it never found a character in the set.

It's a little weird to have an obvious bug like that in a relatively
fundamental method like that (is it some kind of prank?) but anyway, I
fixed it (rather suboptimally) in the attached changeset, and now I
get an error later on in StringTest>>#testIndexOf, namely that I can't
make a CharacterSet newFrom: (String with: 811 asCharacter with: 812
asCharacter) because the CharacterSet's map is a 256-element
ByteArray, and there ain't no position 812 in a 256-element ByteArray!

Also, it's a little weird that the code is full of underscores rather
than :='s, as if it hadn't been touched in five years or more, but the
version browser (is that the right word?) says that it was modified in
4/10/2005, and shows no versions older than that.

So what's going on?  How did I end up running code that fails basic
unit tests due to bugs that are obvious even to me?  I don't know
Smalltalk, so I think the obviousness of the bug owes more to the
excellent debugging facilities and the nature of the bug than to my
own abilities.

I compiled the Squeak 3.9 virtual machine from sources according to
Ian Piumarta's "instructions for the impatient" in README, on my
fairly standard Debian Etch machine, and I'm running the
Squeak3.9-final-7067.image from the Squeak web site.  

My machine has occasionally proven unreliable in the past (crashing
kernel compiles and the like); could that somehow be related?  Did
some bit-flip send me into the Museum of Discarded Code That Never
Worked?

'From Squeak3.9 of 7 November 2006 [latest update: #7067] on 15 December 2007 at 9:47:48 pm'!

!String class methodsFor: 'primitives' stamp: 'kjs 12/15/2007 21:26'!
findFirstInString: aString inSet: inclusionMap startingAt: start
	"Trivial, non-primitive version"
	| i stringSize ascii more |
	inclusionMap size ~= 256 ifTrue: [^ 0].
	stringSize _ aString size.
	more _ true.
	i _ start - 1.
	[more and: [i + 1 <= stringSize]] whileTrue: [
		i _ i + 1.
		ascii _ (aString at: i) asciiValue.
		more _ ascii < 256 ifTrue: [(inclusionMap at: ascii + 1) = 0] ifFalse: [true].
		more ifFalse: [ ^ i ].
	].
	^ 0.
! !




More information about the Squeak-dev mailing list