On Wed, Nov 26, 2008 at 07:45:14PM -0800, Andreas Raab wrote:
Secondly, the issue I was seeing with the iVars being incorrect are one of the subtleties that SE currently doesn't correctly deal with. Here is an illustration:
testCleanupOfOldInstances "Ensure that old instance are cleaned up properly" instance := CleanupTestClass new. Smalltalk garbageCollect. "for easier results make it old"
self assert: CleanupTestClass instanceCount = 1.
ed := SystemEditor new. (ed at: #CleanupTestClass) addInstVarName: #whatever. ed commit.
self assert: CleanupTestClass instanceCount = 1.
ed := SystemEditor new. (ed at: #CleanupTestClass) removeInstVarName: #whatever. ed commit.
self assert: CleanupTestClass instanceCount = 1.
The problem is that since #become: changes class pointers you *must* clean out the old instances or otherwise they'll be completely and utterly broken when you finally #become: the classes itself. This can be achieved by placing a strategic full GC in the right place in the migration process (I'm not sure where that would be in SE but probably somewhere in the migration transaction).
You are right. There is no equivalant to the garbageCollect in ClassBuilder >> migrate:to:. The best place to put it would probably be at the end of SystemEditor>>commit