[squeak-dev] The Inbox: System-ul.384.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Oct 8 21:45:41 UTC 2010


A new version of System was added to project The Inbox:
http://source.squeak.org/inbox/System-ul.384.mcz

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

Name: System-ul.384
Author: ul
Time: 8 October 2010, 9:36:43.893 pm
UUID: 32f7b300-0184-8d4c-b55c-6a49cc6e7199
Ancestors: System-nice.382

- a proposal to speed up SystemDictionary >> #hasBindingThatBeginsWith: which is responsible for the slowdown of Shout and E/OCompletion when the code contains undefined variables.

=============== Diff against System-nice.382 ===============

Item was changed:
  IdentityDictionary subclass: #SystemDictionary
+ 	instanceVariableNames: 'cachedClassNames cachedNonClassNames'
- 	instanceVariableNames: 'cachedClassNames'
  	classVariableNames: ''
  	poolDictionaries: ''
  	category: 'System-Support'!
  
  !SystemDictionary commentStamp: 'nice 3/6/2010 21:56' prior: 0!
  I represent a special dictionary used as global namespace for class names :
  
  	Smalltalk globals classNames.
  
  and for traits too:
  
  	Smalltalk globals traitNames.
  	
  and a few other globals:
  
  	(Smalltalk globals keys reject: [:k | (Smalltalk globals at: k) isBehavior])
  			collect: [:k | k -> (Smalltalk globals at: k) class].
  
  As the above example let you guess, the global namespace of Smalltalk system is accessed through:
  
  	Smalltalk globals.!

Item was changed:
  ----- Method: SystemDictionary>>classNames (in category 'classes and traits') -----
  classNames
+ 	"Answer a sorted collection of all class names. Use the return value of #fillCaches to avoid concurrency issues."
+ 	
+ 	^cachedClassNames ifNil: [ self fillCaches at: 1 ]!
- 	"Answer a SortedCollection of all class names."
- 	| names |
- 	cachedClassNames == nil ifTrue:
- 		[names := OrderedCollection new: self size.
- 		self keysAndValuesDo:[:key :value|
- 			"The key == value name test below addresses two separate issues:
- 				1) Obsolete classes, where key = #Foo and value name = 'AnObsoleteFoo'
- 				2) Aliases, i.e., Smalltalk at: #OtherName put: aClass
- 			"
- 			(value isInMemory and: [(value isKindOf: Class) and: [key == value name]])
- 				ifTrue: [names add: key]].
- 		cachedClassNames := names asSortedCollection].
- 	^ cachedClassNames!

Item was added:
+ ----- Method: SystemDictionary>>fillCaches (in category 'classes and traits') -----
+ fillCaches
+ 	"Fill cachedClassNames and cachedNonClassNames. Return an array with the calculated values."
+ 
+ 	| classNames nonClassNames |
+ 	classNames := OrderedCollection new: self size.
+ 	nonClassNames := OrderedCollection new.
+ 	self keysAndValuesDo: [ :key :value |
+ 		value isInMemory ifTrue: [
+ 			"The key == value name test below addresses two separate issues:
+ 				1) Obsolete classes, where key = #Foo and value name = 'AnObsoleteFoo'
+ 				2) Aliases, i.e., Smalltalk at: #OtherName put: aClass"
+ 			((value isKindOf: Class) and: [ key == value name ])
+ 				ifTrue: [ classNames add: key ]
+ 				ifFalse: [ nonClassNames add: key ] ] ].
+ 	classNames sort.
+ 	cachedNonClassNames := nonClassNames sort.
+ 	cachedClassNames := classNames.
+ 	^{ classNames. nonClassNames }!

Item was changed:
  ----- Method: SystemDictionary>>flushClassNameCache (in category 'classes and traits') -----
  flushClassNameCache
  	"Smalltalk flushClassNameCache"
+ 	"Force recomputation of the cached list of class names and non-class names."
- 	"Force recomputation of the cached list of class names."
  
+ 	cachedClassNames := cachedNonClassNames := nil!
- 	cachedClassNames := nil!

Item was added:
+ ----- Method: SystemDictionary>>hasBindingThatBeginsWith: (in category 'as yet unclassified') -----
+ hasBindingThatBeginsWith: aString
+ 	"Use the cached class and non-class names for better performance."
+ 
+ 	| name searchBlock |
+ 	searchBlock := [ :element |
+ 		(element beginsWith: aString)
+ 			ifTrue: [ 0 ]
+ 			ifFalse: [
+ 				aString < element
+ 					ifTrue: [ -1 ]
+ 					ifFalse: [ 1 ] ] ].
+ 	name := self classNames 
+ 		findBinary: searchBlock
+ 		ifNone: nil.
+ 	name ifNotNil: [ ^true ].
+ 	name := self nonClassNames 
+ 		findBinary: searchBlock
+ 		ifNone: nil.
+ 	^name notNil!

Item was added:
+ ----- Method: SystemDictionary>>nonClassNames (in category 'classes and traits') -----
+ nonClassNames
+ 	"Answer a sorted collection of all non-class names. Use the return value of #fillCaches to avoid concurrency issues."
+ 	
+ 	^cachedNonClassNames ifNil: [ self fillCaches at: 2 ]!




More information about the Squeak-dev mailing list