[squeak-dev] The Trunk: System-cwp.663.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Jan 18 15:50:02 UTC 2014
Colin Putney uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-cwp.663.mcz
==================== Summary ====================
Name: System-cwp.663
Author: cwp
Time: 18 January 2014, 10:48:09.728 am
UUID: f3f0e545-2d39-4f63-aa7e-311e81892dfd
Ancestors: System-cmm.662
Remove direct references to Undeclared and route through the appropriate environment. Flag methods that need to be made environment-aware.
=============== Diff against System-cmm.662 ===============
Item was changed:
----- Method: Association>>objectForDataStream: (in category '*System-Object Storage-objects from disk') -----
objectForDataStream: refStrm
| dp |
"I am about to be written on an object file. If I am a known global, write a proxy that will hook up with the same resource in the destination system."
+ self flag: #environments.
^ (Smalltalk globals associationAt: key ifAbsent: [nil]) == self
ifTrue: [dp := DiskProxy global: #Smalltalk selector: #associationOrUndeclaredAt:
args: (Array with: key).
refStrm replace: self with: dp.
dp]
ifFalse: [self]!
Item was changed:
----- Method: DiskProxy>>comeFullyUpOnReload: (in category 'i/o') -----
comeFullyUpOnReload: smartRefStream
"Internalize myself into a fully alive object after raw loading from a DataStream. (See my class comment.) DataStream will substitute the object from this eval for the DiskProxy."
| globalObj symbol pr nn arrayIndex |
+ self flag: #environments.
symbol := globalObjectName.
"See if class is mapped to another name"
(smartRefStream respondsTo: #renamed) ifTrue: [
"If in outPointers in an ImageSegment, remember original class name.
See mapClass:installIn:. Would be lost otherwise."
((thisContext sender sender sender sender sender sender
sender sender receiver class == ImageSegment) and: [
thisContext sender sender sender sender method ==
(DataStream compiledMethodAt: #readArray)]) ifTrue: [
arrayIndex := (thisContext sender sender sender sender) tempAt: 4.
"index var in readArray. Later safer to find i on stack of context."
smartRefStream renamedConv at: arrayIndex put: symbol]. "save original name"
symbol := smartRefStream renamed at: symbol ifAbsent: [symbol]]. "map"
globalObj := Smalltalk at: symbol ifAbsent: [
preSelector == nil & (constructorSelector = #yourself) ifTrue: [
Transcript cr; show: symbol, ' is undeclared.'.
(Undeclared includesKey: symbol) ifTrue: [^ Undeclared at: symbol].
Undeclared at: symbol put: nil.
^ nil].
^ self error: 'Global "', symbol, '" not found'].
((symbol == #World) and: [Smalltalk isMorphic not]) ifTrue: [
self inform: 'These objects will work better if opened in a Morphic World.
Dismiss and reopen all menus.'].
preSelector ifNotNil: [
Symbol hasInterned: preSelector ifTrue: [:selector |
[globalObj := globalObj perform: selector] on: Error do: [:ex |
ex messageText = 'key not found' ifTrue: [^ nil].
^ ex signal]]
].
symbol == #Project ifTrue: [
(constructorSelector = #fromUrl:) ifTrue: [
nn := (constructorArgs first findTokens: '/') last.
nn := (nn findTokens: '.|') first.
pr := Project named: nn.
^ pr ifNil: [self] ifNotNil: [pr]].
pr := globalObj perform: constructorSelector withArguments: constructorArgs.
^ pr ifNil: [self] ifNotNil: [pr]]. "keep the Proxy if Project does not exist"
constructorSelector ifNil: [^ globalObj].
Symbol hasInterned: constructorSelector ifTrue: [:selector |
[^ globalObj perform: selector withArguments: constructorArgs] on: Error do: [:ex |
ex messageText = 'key not found' ifTrue: [^ nil].
^ ex signal]
].
"args not checked against Renamed"
^ nil "was not in proper form"!
Item was changed:
----- Method: ImageSegment>>prepareToBeSaved (in category 'fileIn/Out') -----
prepareToBeSaved
"Prepare objects in outPointers to be written on the disk. They must be able to match up with existing objects in their new system. outPointers is already a copy.
Classes are already converted to a DiskProxy.
Associations in outPointers:
1) in Smalltalk.
2) in a classPool.
3) in a shared pool.
4) A pool dict pointed at directly"
| left myClasses outIndexes |
+ self flag: #environments.
myClasses := Set new.
arrayOfRoots do: [:aRoot | aRoot class class == Metaclass ifTrue: [myClasses add: aRoot]].
outIndexes := IdentityDictionary new.
outPointers withIndexDo: [:anOut :ind | | key |
anOut isVariableBinding ifTrue: [
(myClasses includes: anOut value)
ifFalse: [outIndexes at: anOut put: ind]
ifTrue: [(Smalltalk globals associationAt: anOut key ifAbsent: [3]) == anOut
ifTrue: [outPointers at: ind put:
(DiskProxy global: #Smalltalk selector: #associationDeclareAt:
args: (Array with: anOut key))]
ifFalse: [outIndexes at: anOut put: ind]
]].
(anOut isKindOf: Dictionary) ifTrue: ["Pools pointed at directly"
(key := Smalltalk globals keyAtIdentityValue: anOut ifAbsent: [nil]) ifNotNil: [
outPointers at: ind put:
(DiskProxy global: key selector: #yourself args: #())]].
anOut isMorph ifTrue: [outPointers at: ind put:
(StringMorph contents: anOut printString, ' that was not counted')]
].
left := outIndexes keys asSet.
left size > 0 ifTrue: ["Globals"
(left copy) do: [:assoc | "stay stable while delete items"
(Smalltalk globals associationAt: assoc key ifAbsent: [3]) == assoc ifTrue: [
outPointers at: (outIndexes at: assoc) put:
(DiskProxy global: #Smalltalk selector: #associationAt:
args: (Array with: assoc key)).
left remove: assoc]]].
left size > 0 ifTrue: ["Class variables"
Smalltalk allClassesDo: [:cls | cls classPool size > 0 ifTrue: [
(left copy) do: [:assoc | "stay stable while delete items"
(cls classPool associationAt: assoc key ifAbsent: [3]) == assoc ifTrue: [
outPointers at: (outIndexes at: assoc) put:
(DiskProxy new global: cls name
preSelector: #classPool
selector: #associationAt:
args: (Array with: assoc key)).
left remove: assoc]]]]].
left size > 0 ifTrue: ["Pool variables"
Smalltalk globals associationsDo: [:poolAssoc | | pool |
poolAssoc value class == Dictionary ifTrue: ["a pool"
pool := poolAssoc value.
(left copy) do: [:assoc | "stay stable while delete items"
(pool associationAt: assoc key ifAbsent: [3]) == assoc ifTrue: [
outPointers at: (outIndexes at: assoc) put:
(DiskProxy global: poolAssoc key selector: #associationAt:
args: (Array with: assoc key)).
left remove: assoc]]]]].
left size > 0 ifTrue: [
"If points to class in arrayOfRoots, must deal with it separately"
"OK to have obsolete associations that just get moved to the new system"
self inform: 'extra associations'.
left inspect].
!
Item was changed:
----- Method: ObjectScanner>>rename:toBe: (in category 'utilities') -----
rename: existingName toBe: newName
"See if there is a conflict between what the fileIn wants to call the new UniClass (Player23) and what already exists for another unique instance. If conflict, make a class variable to intercept the existingName and direct it to class newName."
+ self flag: #environments.
existingName = newName ifFalse: [
self class ensureClassPool. "create the dictionary"
"can't use addClassVarName: because it checks for conflicts with Smalltalk"
(self class classPool includesKey: existingName) ifFalse:
["Pick up any refs in Undeclared"
self class classPool declare: existingName from: Undeclared].
self class classPool at: existingName put: (Smalltalk at: newName).
pvt3SmartRefStrm renamed at: existingName put: newName]!
Item was changed:
----- Method: SmalltalkImage class>>cleanUp (in category 'class initialization') -----
cleanUp
"Flush caches"
- Smalltalk flushClassNameCache.
- Undeclared removeUnreferencedKeys.
Smalltalk removeObsoleteClassesFromCompactClassesArray!
Item was changed:
----- Method: SmalltalkImage>>associationDeclareAt: (in category 'dictionary access') -----
associationDeclareAt: aKey
"DO NOT DEPRECATE - used by ImageSegments"
+ self flag: #environments.
-
^globals associationDeclareAt: aKey!
Item was changed:
----- Method: SmalltalkImage>>cleanOutUndeclared (in category 'housekeeping') -----
cleanOutUndeclared
+ "This should be deprecated, and senders rewritten to deal with environments directly"
+ self flag: #environments.
+
+ globals purgeUndeclared.!
- globals undeclared removeUnreferencedKeys!
Item was changed:
----- Method: SystemDictionary>>associationOrUndeclaredAt: (in category 'dictionary access') -----
associationOrUndeclaredAt: key
"return an association or install in undeclared. Used for mating up ImageSegments."
+ self flag: #environments.
^ self associationAt: key ifAbsent: [
Undeclared at: key put: nil.
Undeclared associationAt: key]!
Item was changed:
----- Method: SystemNavigation>>methodsWithUnboundGlobals (in category 'query') -----
methodsWithUnboundGlobals
"Get all methods that use undeclared global objects that are not listed in Undeclared. For a clean image the result should be empty."
"SystemNavigation new methodsWithUnboundGlobals"
+ self flag: #environments.
+
-
^self allSelect:
[:m|
m literals anySatisfy:
[:l|
l isVariableBinding
and: [l key isSymbol "avoid class-side methodClass literals"
and: [(m methodClass bindingOf: l key)
ifNil: [(Undeclared associationAt: l key ifAbsent: []) ~~ l]
ifNotNil: [:b| b ~~ l]]]]]!
Item was changed:
Object subclass: #Utilities
instanceVariableNames: ''
+ classVariableNames: 'AuthorInitials AuthorName CommonRequestStrings LastStats ScrapsBook'
- classVariableNames: 'AuthorInitials AuthorName CommonRequestStrings LastStats'
poolDictionaries: ''
category: 'System-Support'!
!Utilities commentStamp: '<historical>' prior: 0!
A repository for general and miscellaneous utilities; much of what is here are in effect global methods that don't naturally attach to anything else. 1/96 sw!
More information about the Squeak-dev
mailing list
|