I see a problem here:
In Interpreter>>isInMissingModules: there I have removed the string/symbol compare for a merely oop compare: So different in oops, but equal in bytes strings would fill up the cache fast, if many different functions from the same module - stored as strings with different oops - are called. This could lead to a bug: there is no caching anymore, if some (> cachesize) different functions each stemming from another module are called in sequence!
Well, as I said there are only symbols used here. Since this is a cache it ought to be fast and I don't consider cache misses for degenerate cases to be bugs - not if it means much more expensive comparisons for the common case.
But in either case it has to be cleared during startup time. What do you think of is a good time? The cache has to be cleared early before _every_ possible module call.
SystemDictionary>>clearExternalObjects (or its caller) seems to me the right place.
A.