Matt wrote:
The puzzling critter is CaretForm.
It looks like it should be a class variable, but it is not defined as one in Paragraph or any of its superclasses. It is not a class instance variable either. It doesn't show up as a global in the Smalltalk dictionary. The explain message says that it can't explain it.
Yes, it does look puzzling. Here's the explanation:
If you look closely, the Paragraph class uses a pool dictionary called TextConstants, which is defined and initialized (along with the CaretForm) in the Text class. At the time that Paragraph>>caretFormForDepth: was compiled, this dictionary existed, so the compiler found the value for CaretForm and placed it in the literal table for the CompiledMethod. Later, the TextConstants pool was accidentally removed before the final 1.3 image was saved. However, pre-existing CompiledMethods still held onto the literals used from that pool -- that explains why the method runs correctly, but you cannot re-compile it, explain CaretForm, etc.
One of the early messages about 1.3 mentioned the accidental removal of the TextConstants pool -- to fix it, do:
Text initialize.
-- tim
squeak-dev@lists.squeakfoundation.org