[squeak-dev] The Trunk: System-nice.156.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Oct 20 00:14:05 UTC 2009


Nicolas Cellier uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-nice.156.mcz

==================== Summary ====================

Name: System-nice.156
Author: nice
Time: 20 October 2009, 12:13 pm
UUID: 65d20744-0a1c-374b-9f79-931de44adb72
Ancestors: System-nice.155

use #fasterKeys

=============== Diff against System-nice.155 ===============

Item was changed:
  ----- Method: SystemDictionary>>inspectGlobals (in category 'ui') -----
  inspectGlobals
  	"Smalltalk  inspectGlobals"
  	
  	| associations aDict |
+ 	associations := ((self  fasterKeys select: [:aKey | ((self  at: aKey) isKindOf: Class) not]) sort collect:[:aKey | self associationAt: aKey]).
- 	associations := ((self  keys select: [:aKey | ((self  at: aKey) isKindOf: Class) not]) asSortedArray collect:[:aKey | self associationAt: aKey]).
  	aDict := IdentityDictionary new.
  	associations do: [:as | aDict add: as].
  	aDict inspectWithLabel: 'The Globals'!

Item was changed:
  ----- Method: ResourceManager class>>lookupOriginalResourceCacheEntry:for: (in category 'resource caching') -----
  lookupOriginalResourceCacheEntry: resourceFileName for: resourceUrl
  	"See if we have cached the resource described by the given url in an earlier version of the same project on the same server. In that case we don't need to upload it again but rather link to it."
+ 	| resourceBase resourceMatch matchingUrls |
- 	| candidates resourceBase resourceMatch matchingUrls |
  	
  	CachedResources ifNil:[^nil].
  
  	"Strip the version number from the resource url"
  	resourceBase := resourceUrl copyFrom: 1 to: (resourceUrl lastIndexOf: $.) .
  	"Now collect all urls that have the same resource base"
  	resourceMatch := resourceBase , '*/' , resourceFileName.
+ 	matchingUrls := self resourceCache fasterKeys
- 	matchingUrls := self resourceCache keys
  		select: [:entry | (resourceMatch match: entry) and: [(entry beginsWith: resourceUrl) not]].
  	matchingUrls isEmpty
  		ifTrue: [^nil].
+ 	matchingUrls sort do: [:entry | | candidates |
- 	matchingUrls asSortedCollection do: [:entry | 
  			candidates := (self resourceCache at: entry).
  			candidates isEmptyOrNil
  				ifFalse: [candidates do: [:candidate |
  					candidate = resourceFileName
  						ifTrue: [^entry]]]].
  	^nil!

Item was changed:
  ----- Method: SystemDictionary>>removeNormalCruft (in category 'shrinking') -----
  removeNormalCruft
  	"Remove various graphics, uniclasses, references. Caution: see
  	comment at bottom of method"
  	"Smalltalk removeNormalCruft"
  	ScriptingSystem stripGraphicsForExternalRelease.
  	ScriptingSystem spaceReclaimed.
+ 	References fasterKeys
- 	References keys
  		do: [:k | References removeKey: k].
  	self classNames
  		do: [:cName | #('Player' 'CardPlayer' 'Component' 'WonderlandActor' 'MorphicModel' 'PlayWithMe' )
  				do: [:superName | ((cName ~= superName
  								and: [cName beginsWith: superName])
  							and: [(cName allButFirst: superName size)
  									allSatisfy: [:ch | ch isDigit]])
  						ifTrue: [self removeClassNamed: cName]]].
  	self
  		at: #Wonderland
  		ifPresent: [:cls | cls removeActorPrototypesFromSystem].
  	ChangeSet current clear
  	"Caution: if any worlds in the image happen to have uniclass
  	players associated with them, running this method would
  	likely compromise their functioning and could cause errors,
  	especially if the uniclass player of the current world had any
  	scripts set to ticking. If that happens to you somehow, you will
  	probably want to find a way to reset the offending world's
  	player to be an UnscriptedCardPlayer, or perhaps nil"!

Item was changed:
  ----- Method: NaturalLanguageTranslator>>fileOutOn:keys: (in category 'fileIn/fileOut') -----
  fileOutOn: aStream keys: keys 
  	"self current fileOutOn: Transcript. Transcript endEntry"
  	(keys
+ 		ifNil: [generics fasterKeys sort])
- 		ifNil: [generics keys asSortedCollection])
  		do: [:key | self
  				nextChunkPut: (generics associationAt: key)
  				on: aStream].
  	keys
  		ifNil: [self untranslated
  				do: [:each | self nextChunkPut: each -> '' on: aStream]].
  	aStream nextPut: $!!;
  		 cr!

Item was changed:
  ----- Method: ResourceCollector>>forgetObsolete (in category 'initialize') -----
  forgetObsolete
  	"Forget obsolete locators, e.g., those that haven't been referenced and not been stored on a file."
+ 	locatorMap fasterKeys do:[:k|
- 	locatorMap keys "copy" do:[:k|
  		(locatorMap at: k) localFileName ifNil:[locatorMap removeKey: k]].!

Item was changed:
  ----- Method: NaturalLanguageTranslator class>>cleanUpCache (in category 'private') -----
  cleanUpCache
  	"NaturalLanguageTranslator cleanUpCache"
  
+ 	self cachedTranslations fasterKeys do: [:key |
- 	self cachedTranslations keys do: [:key |
  		key isoLanguage size > 2 ifTrue: [self cachedTranslations removeKey: key]]!

Item was changed:
  ----- Method: ResourceManager>>fixJISX0208Resource (in category 'private') -----
  fixJISX0208Resource
+ 	resourceMap fasterKeys do: [:key |
+ 		| value url |
- 
- 	| keys value url |
- 	keys := resourceMap keys.
- 
- 	keys do: [:key |
  		value := resourceMap at: key.
  		url := key urlString copy.
  		url isOctetString not ifTrue: [url mutateJISX0208StringToUnicode].
  		resourceMap removeKey: key.
  		key urlString: url.
  		resourceMap at: key put: value.
  	].
  !

Item was changed:
  ----- Method: ResourceManager>>loaderProcess (in category 'loading') -----
  loaderProcess
  	| loader requests req locator resource stream |
  	loader := HTTPLoader default.
  	requests := Dictionary new.
  	self prioritizedUnloadedResources do:[:loc|
  		req := HTTPLoader httpRequestClass for: (self hackURL: loc urlString) in: loader.
  		loader addRequest: req.
  		requests at: req put: loc].
  	[stopFlag or:[requests isEmpty]] whileFalse:[
  		stopSemaphore waitTimeoutMSecs: 500.
+ 		requests fasterKeys "need a copy" do:[:r|
- 		requests keys "need a copy" do:[:r|
  			r isSemaphoreSignaled ifTrue:[
  				locator := requests at: r.
  				requests removeKey: r.
  				stream := r contentStream.
  				resource := resourceMap at: locator ifAbsent:[nil].
  				self class cacheResource: locator urlString stream: stream.
  				self installResource: resource
  					from: stream
  					locator: locator.
  				(resource isForm) ifTrue:[
  					WorldState addDeferredUIMessage: self formChangedReminder]
  ifFalse: [self halt].
  			].
  		].
  	].
  	"Either done downloading or terminating process"
  	stopFlag ifTrue:[loader abort].
  	loaderProcess := nil.
  	stopSemaphore := nil.!

Item was changed:
  ----- Method: ResourceManager>>abandonResourcesThat: (in category 'private') -----
  abandonResourcesThat: matchBlock
  	"Private. Forget resources that match the given argument block"
+ 	resourceMap fasterKeys "need copy" do:[:loc|
- 	resourceMap keys "need copy" do:[:loc|
  		(matchBlock value: loc) ifTrue:[
  			resourceMap removeKey: loc ifAbsent:[].
  			loaded remove: loc ifAbsent:[].
  			unloaded remove: loc ifAbsent:[].
  		].
  	].!

Item was changed:
  ----- Method: SpaceTally>>compareTallyIn:to: (in category 'fileOut') -----
  compareTallyIn: beforeFileName to: afterFileName
  	"SpaceTally new compareTallyIn: 'tally' to: 'tally2'"
  
+ 	| answer s beforeDict a afterDict allKeys |
- 	| answer s beforeDict a afterDict allKeys before after diff |
  	beforeDict := Dictionary new.
  	s := FileDirectory default fileNamed: beforeFileName.
  	[s atEnd] whileFalse: [
  		a := Array readFrom: s nextLine.
  		beforeDict at: a first put: a allButFirst.
  	].
  	s close.
  	afterDict := Dictionary new.
  	s := FileDirectory default fileNamed: afterFileName.
  	[s atEnd] whileFalse: [
  		a := Array readFrom: s nextLine.
  		afterDict at: a first put: a allButFirst.
  	].
  	s close.
  	answer := WriteStream on: String new.
+ 	allKeys := (Set new addAll: beforeDict fasterKeys; addAll: afterDict fasterKeys; yourself) asSortedCollection.
- 	allKeys := (Set new addAll: beforeDict keys; addAll: afterDict keys; yourself) asSortedCollection.
  	allKeys do: [ :each |
+ 		| before after diff |
  		before := beforeDict at: each ifAbsent: [#(0 0 0)].
  		after := afterDict at: each ifAbsent: [#(0 0 0)].
  		diff := before with: after collect: [ :vBefore :vAfter | vAfter - vBefore].
  		diff = #(0 0 0) ifFalse: [
  			answer nextPutAll: each,'  ',diff printString; cr.
  		].
  	].
  	StringHolder new contents: answer contents; openLabel: 'space diffs'.
  	
  
  
  !

Item was changed:
  ----- Method: ResourceCollector>>removeLocator: (in category 'accessing') -----
  removeLocator: loc
+ 	locatorMap fasterKeys do:[:k|
- 	locatorMap keys "copy" do:[:k|
  		(locatorMap at: k) = loc ifTrue:[locatorMap removeKey: k]].!

Item was changed:
  ----- Method: SystemDictionary>>cleanUpUndoCommands (in category 'shrinking') -----
  cleanUpUndoCommands
  	"Smalltalk cleanUpUndoCommands"  "<== print this to get classes involved"
  
  	| classes i p |
  	classes := Bag new.
  	'Ferreting out obsolete undo commands'
  		displayProgressAt: Sensor cursorPoint
  		from: 0 to: Morph withAllSubclasses size
  		during:
  	[:bar | i := 0.
  	Morph withAllSubclassesDo:
  		[:c | bar value: (i := i+1).
  		c allInstancesDo:
  			[:m | (p := m otherProperties) ifNotNil:
+ 				[p fasterKeys do:
- 				[p keys do:
  					[:k | (p at: k) class == Command ifTrue:
  						[classes add: c name.
  						m removeProperty: k]]]]]].
  	^ classes!

Item was changed:
  ----- Method: ObjectScanner>>clear (in category 'initialize-release') -----
  clear
  	"remove all old class vars.  They were UniClasses being remapped to aviod a name conflict."
  
+ 	self class classPool fasterKeys do: [:key |
- 	self class classPool keys do: [:key |
  		self class classPool removeKey: key].	"brute force"!

Item was changed:
  ----- Method: SystemDictionary>>poolUsers (in category 'retrieving') -----
  poolUsers
  	"Answer a dictionary of pool name -> classes that refer to it.
  	Also includes any globally know dictionaries (such as
  	Smalltalk, Undeclared etc) which although not strictly
  	accurate is potentially useful information"
  	"Smalltalk poolUsers"
+ 	| poolUsers |
- 	| poolUsers pool refs |
  	poolUsers := Dictionary new.
+ 	self fasterKeys
- 	self keys
  		do: [:k | "yes, using isKindOf: is tacky but for reflective code like
  			this it is very useful. If you really object you can:-
  			a) go boil your head.
  			b) provide a better answer.
  			your choice."
+ 			| pool refs |
  			(((pool := self at: k) isKindOf: Dictionary)
  					or: [pool isKindOf: SharedPool class])
  				ifTrue: [refs := self systemNavigation allClasses
  								select: [:c | c sharedPools identityIncludes: pool]
  								thenCollect: [:c | c name].
  					refs
  						add: (self systemNavigation
  								allCallsOn: (self associationAt: k)).
  					poolUsers at: k put: refs]].
  	^ poolUsers!

Item was changed:
  ----- Method: DeepCopier>>mapUniClasses (in category 'like fullCopy') -----
  mapUniClasses
  	"For new Uniclasses, map their class vars to the new objects.  And their additional class instance vars.  (scripts slotInfo) and cross references like (player321)."
  	"Players also refer to each other using associations in the References dictionary.  Search the methods of our Players for those.  Make new entries in References and point to them."
  | pp oldPlayer newKey newAssoc oldSelList newSelList |
  
  	newUniClasses ifFalse: [^ self].	"All will be siblings.  uniClasses is empty"
  "Uniclasses use class vars to hold onto siblings who are referred to in code"
  pp := Player class superclass instSize.
  uniClasses do: [:playersClass | "values = new ones"
  	playersClass classPool associationsDo: [:assoc |
  		assoc value: (assoc value veryDeepCopyWith: self)].
  	playersClass scripts: (playersClass privateScripts veryDeepCopyWith: self).	"pp+1"
  	"(pp+2) slotInfo was deepCopied in copyUniClass and that's all it needs"
  	pp+3 to: playersClass class instSize do: [:ii | 
  		playersClass instVarAt: ii put: 
  			((playersClass instVarAt: ii) veryDeepCopyWith: self)].
  	].
  
  "Make new entries in References and point to them."
+ References fasterKeys do: [:playerName |
- References keys "copy" do: [:playerName |
  	oldPlayer := References at: playerName.
  	(references includesKey: oldPlayer) ifTrue: [
  		newKey := (references at: oldPlayer) "new player" uniqueNameForReference.
  		"now installed in References"
  		(references at: oldPlayer) renameTo: newKey]].
  uniClasses "values" do: [:newClass |
  	oldSelList := OrderedCollection new.   newSelList := OrderedCollection new.
  	newClass selectorsDo: [:sel | 
  		(newClass compiledMethodAt: sel)	 literals do: [:assoc |
  			assoc isVariableBinding ifTrue: [
  				(References associationAt: assoc key ifAbsent: [nil]) == assoc ifTrue: [
  					newKey := (references at: assoc value ifAbsent: [assoc value]) 
  									externalName asSymbol.
  					(assoc key ~= newKey) & (References includesKey: newKey) ifTrue: [
  						newAssoc := References associationAt: newKey.
  						newClass methodDictionary at: sel put: 
  							(newClass compiledMethodAt: sel) clone.	"were sharing it"
  						(newClass compiledMethodAt: sel)
  							literalAt: ((newClass compiledMethodAt: sel) literals indexOf: assoc)
  							put: newAssoc.
  						(oldSelList includes: assoc key) ifFalse: [
  							oldSelList add: assoc key.  newSelList add: newKey]]]]]].
  	oldSelList with: newSelList do: [:old :new |
  			newClass replaceSilently: old to: new]].	"This is text replacement and can be wrong"!

Item was changed:
  ----- Method: EventManager class>>flushEvents (in category 'initialize-release') -----
  flushEvents
  	"Object flushEvents"
  	| msgSet |
  	self actionMaps keysAndValuesDo:[:rcvr :evtDict| rcvr ifNotNil:[
  		"make sure we don't modify evtDict while enumerating"
+ 		evtDict fasterKeys do:[:evtName|
- 		evtDict keys do:[:evtName|
  			msgSet := evtDict at: evtName ifAbsent:[nil].
  			(msgSet == nil) ifTrue:[rcvr removeActionsForEvent: evtName]]]].
  	EventManager actionMaps finalizeValues. !

Item was changed:
  ----- Method: ResourceManager>>registerUnloadedResources (in category 'loading') -----
  registerUnloadedResources
+ 	resourceMap fasterKeys do: [:newLoc |
- 	resourceMap keys do: [:newLoc |
  		unloaded add: newLoc]
  !

Item was changed:
  ----- Method: ImageSegment class>>swapOutInactiveClasses (in category 'testing') -----
  swapOutInactiveClasses  "ImageSegment swapOutInactiveClasses"  
  	"Make up segments by grouping unused classes by system category.
  	Read about, and execute discoverActiveClasses, and THEN execute this one."
  
  	| unused groups i roots |
  	ImageSegment recoverFromMDFault.
  	ImageSegmentRootStub recoverFromMDFault.
  	unused := Smalltalk allClasses select: [:c | (c instVarNamed: 'methodDict') == nil].
  	unused do: [:c | c recoverFromMDFault].
  	groups := Dictionary new.
  	SystemOrganization categories do:
  		[:cat |
  		i := (cat findLast: [:c | c = $-]) - 1.
  		i <= 0 ifTrue: [i := cat size].
  		groups at: (cat copyFrom: 1 to: i)
  			put: (groups at: (cat copyFrom: 1 to: i) ifAbsent: [Array new]) ,
  			((SystemOrganization superclassOrder: cat) select: [:c | 
  				unused includes: c]) asArray].
+ 	groups fasterKeys do:
- 	groups keys do:
  		[:cat | roots := groups at: cat.
  		Transcript cr; cr; show: cat; cr; print: roots; endEntry.
  		roots := roots , (roots collect: [:c | c class]).
  		(cat beginsWith: 'Sys' "something here breaks") ifFalse:
  			[(ImageSegment new copyFromRoots: roots sizeHint: 0) extract; 
  				writeToFile: cat].
  		Transcript cr; print: Smalltalk garbageCollect; endEntry]!

Item was changed:
  ----- Method: ImageSegment>>comeFullyUpOnReload: (in category 'fileIn/Out') -----
  comeFullyUpOnReload: smartRefStream
  	"fix up the objects in the segment that changed size.  An
  object in the segment is the wrong size for the modern version of the
  class.  Construct a fake class that is the old size.  Replace the
  modern class with the old one in outPointers.  Load the segment.
  Traverse the instances, making new instances by copying fields, and
  running conversion messages.  Keep the new instances.  Bulk forward
  become the old to the new.  Let go of the fake objects and classes.
  	After the install (below), arrayOfRoots is filled in.
  Globalize new classes.  Caller may want to do some special install on
  certain objects in arrayOfRoots.
  	May want to write the segment out to disk in its new form."
  
  	| mapFakeClassesToReal ccFixups receiverClasses
  rootsToUnhiberhate myProject existing |
  
  	RecentlyRenamedClasses := nil.		"in case old data
  hanging around"
  	mapFakeClassesToReal := smartRefStream reshapedClassesIn: outPointers.
  		"Dictionary of just the ones that change shape.
  Substitute them in outPointers."
  	ccFixups := self remapCompactClasses: mapFakeClassesToReal
  				refStrm: smartRefStream.
  	ccFixups ifFalse: [^ self error: 'A class in the file is not
  compatible'].
  	endMarker := segment nextObject. 	"for enumeration of objects"
  	endMarker == 0 ifTrue: [endMarker := 'End' clone].
  	self fixCapitalizationOfSymbols.
  	arrayOfRoots := self loadSegmentFrom: segment outPointers: outPointers.
  		"Can't use install.  Not ready for rehashSets"
  	mapFakeClassesToReal isEmpty ifFalse: [
  		self reshapeClasses: mapFakeClassesToReal refStream:
  smartRefStream
  	].
  	"When a Project is stored, arrayOfRoots has all objects in
  the project, except those in outPointers"
  	arrayOfRoots do: [:importedObject |
  		((importedObject isMemberOf: WideString) or: [importedObject isMemberOf: WideSymbol]) ifTrue: [
  			importedObject mutateJISX0208StringToUnicode.
  			importedObject class = WideSymbol ifTrue: [
  				"self halt."
  				Symbol hasInterned: 
  importedObject asString ifTrue: [:multiSymbol |
  					multiSymbol == importedObject
  ifFalse: [
  						importedObject
  becomeForward: multiSymbol.
  					].
  				].
  			].
  		].
  		(importedObject isKindOf: TTCFontSet) ifTrue: [
  			existing := TTCFontSet familyName:
  importedObject familyName
  						pointSize:
  importedObject pointSize.	"supplies default"
  			existing == importedObject ifFalse:
  [importedObject becomeForward: existing].
  		].
  	].
  	"Smalltalk garbageCollect.   MultiSymbol rehash.  These take
  time and are not urgent, so don't to them.  In the normal case, no
  bad MultiSymbols will be found."
  
  	receiverClasses := self restoreEndianness.		"rehash sets"
  	smartRefStream checkFatalReshape: receiverClasses.
  
  	"Classes in this segment."
  	arrayOfRoots do: [:importedObject |
  		importedObject class class == Metaclass ifTrue: [self
  declare: importedObject]].
  	arrayOfRoots do: [:importedObject |
  		(importedObject isKindOf: CompiledMethod) ifTrue: [
  			importedObject sourcePointer > 0 ifTrue:
  [importedObject zapSourcePointer]].
  		(importedObject isKindOf: Project) ifTrue: [
  			myProject := importedObject.
  			importedObject ensureChangeSetNameUnique.
  			Project addingProject: importedObject.
  			importedObject restoreReferences.
  			self dependentsRestore: importedObject.
  			ScriptEditorMorph writingUniversalTiles:
  				((importedObject projectPreferenceAt:
  #universalTiles) ifNil: [false])]].
  
  	rootsToUnhiberhate := arrayOfRoots select: [:importedObject |
  		importedObject respondsTo: #unhibernate
  	"ScriptEditors and ViewerFlapTabs"
  	].
  	myProject ifNotNil: [
  		myProject world setProperty: #thingsToUnhibernate
  toValue: rootsToUnhiberhate
  	].
  
  	mapFakeClassesToReal isEmpty ifFalse: [
+ 		mapFakeClassesToReal fasterKeys do: [:aFake |
- 		mapFakeClassesToReal keys do: [:aFake |
  			aFake indexIfCompact > 0 ifTrue: [aFake
  becomeUncompact].
  			aFake removeFromSystemUnlogged].
  		SystemOrganization removeEmptyCategories].
  	"^ self"
  !




More information about the Squeak-dev mailing list