[squeak-dev] The Inbox: Morphic-dtl.1360.mcz

H. Hirzel hannes.hirzel at gmail.com
Sun Nov 12 03:48:55 UTC 2017


Eliminsating the access to the global 'World' is fine.

But what about

    self world

instead of

     Project current world

Or is it an issue of speed?

--Hannes

On 11/11/17, David T. Lewis <lewis at mail.msen.com> wrote:
> I think that it should be possible to eliminate World as a global without
> hurting performance. The code gets more verbose, but it reduces
> opportunities
> for hidden bugs, so I think it is worth the tradeoff.
>
> I have to admit that the subject of "World global elimination" sounds a bit
> ominous, so I decided to put Morphic-dtl.1360 and MorphicExtras-dtl.214 in
> the inbox first ;-)
>
> Are there any objections to proceding in this direction? If not I will move
> the changes to trunk in day or two.
>
> Dave
>
>
>
> On Sat, Nov 11, 2017 at 09:04:49PM +0000, commits at source.squeak.org wrote:
>> David T. Lewis uploaded a new version of Morphic to project The Inbox:
>> http://source.squeak.org/inbox/Morphic-dtl.1360.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Morphic-dtl.1360
>> Author: dtl
>> Time: 11 November 2017, 4:04:34.153784 pm
>> UUID: 0e1f3870-5f57-4dc6-a1e7-5d8ce68b71b5
>> Ancestors: Morphic-dtl.1359
>>
>> World global elimination. Once the current project has been entered,
>> Project current world == World. Begin eliminating references to the global
>> variable World in cases where it is not required.
>>
>> =============== Diff against Morphic-dtl.1359 ===============
>>
>> Item was changed:
>>   ----- Method: ComplexProgressIndicator>>backgroundWorldDisplay (in
>> category 'as yet unclassified') -----
>>   backgroundWorldDisplay
>>
>>   	self flag: #bob.		"really need a better way to do this"
>>
>>   			"World displayWorldSafely."
>>
>>   	"ugliness to try to track down a possible error"
>>
>>
>> + 	[Project current world displayWorld] ifError: [ :a :b |
>> - 	[World displayWorld] ifError: [ :a :b |
>>   		| f |
>>   		stageCompleted := 999.
>>   		f := FileDirectory default fileNamed: 'bob.errors'.
>>   		f nextPutAll: a printString,'  ',b printString; cr; cr.
>>   		f nextPutAll: 'worlds equal ',(formerWorld == World) printString; cr;
>> cr.
>>   		f nextPutAll: thisContext longStack; cr; cr.
>>   		f nextPutAll: formerProcess suspendedContext longStack; cr; cr.
>>   		f close. Beeper beep.
>>   	].
>>   !
>>
>> Item was changed:
>>   ----- Method: Debugger class>>morphicOpenInterrupt:onProcess: (in
>> category '*Morphic-opening') -----
>>   morphicOpenInterrupt: aString onProcess: interruptedProcess
>>   	"Open a notifier in response to an interrupt. An interrupt occurs when
>> the user types the interrupt key (cmd-. on Macs, ctrl-c or alt-. on other
>> systems) or when the low-space watcher detects that memory is low."
>>   	| debugger |
>>   	<primitive: 19> "Simulation guard"
>>   	debugger := self new.
>>   	debugger
>>   		process: interruptedProcess
>>   		controller: nil
>>   		context: interruptedProcess suspendedContext.
>>   	debugger externalInterrupt: true.
>>
>>   	Preferences logDebuggerStackToFile ifTrue:
>>   		[(aString includesSubstring: 'Space') & (aString includesSubstring:
>> 'low')
>>   			ifTrue: [Smalltalk logError: aString inContext: debugger
>> interruptedContext to: 'LowSpaceDebug.log']
>>   			"logging disabled for 4.3 release, see
>>
>> 				http://lists.squeak.org/pipermail/squeak-dev/2011-December/162503.html"
>>   			"ifFalse: [Smalltalk logSqueakError: aString inContext: debugger
>> interruptedContext]"].
>>
>> + 	Preferences eToyFriendly ifTrue: [Project current world
>> stopRunningAll].
>> - 	Preferences eToyFriendly ifTrue: [World stopRunningAll].
>>   	^debugger
>>   		openNotifierContents: nil label: aString;
>>   		yourself
>>   !
>>
>> Item was changed:
>>   ----- Method: Morph>>updateFromResource (in category 'fileIn/out') -----
>>   updateFromResource
>>   	| pathName newMorph f |
>>   	(pathName := self valueOfProperty: #resourceFilePath) ifNil: [^self].
>>   	(pathName asLowercase endsWith: '.morph')
>>   		ifTrue:
>>   			[newMorph := (FileStream readOnlyFileNamed: pathName)
>> fileInObjectAndCode.
>>   			(newMorph isMorph)
>>   				ifFalse: [^self error: 'Resource not a single morph']]
>>   		ifFalse:
>>   			[f := Form fromFileNamed: pathName.
>>   			f ifNil: [^self error: 'unrecognized image file format'].
>> + 			newMorph := Project current world drawingClass withForm: f].
>> - 			newMorph := World drawingClass withForm: f].
>>   	newMorph setProperty: #resourceFilePath toValue: pathName.
>>   	self owner replaceSubmorph: self by: newMorph!
>>
>> Item was changed:
>>   ----- Method: MorphHierarchyListMorph>>createContainer (in category
>> 'private') -----
>>   createContainer
>>   	"Private - Create a container"
>>   	| container |
>>   	container := BorderedMorph new.
>> + 	container extent: (Project current world extent * (1 / 4 @ (2 / 3)))
>> rounded.
>> - 	container extent: (World extent * (1 / 4 @ (2 / 3))) rounded.
>>   	container layoutPolicy: TableLayout new.
>>   	container hResizing: #rigid.
>>   	container vResizing: #rigid.
>>   	container
>>   		setColor: (Color gray: 0.9)
>>   		borderWidth: 1
>>   		borderColor: Color gray.
>>   	container layoutInset: 0.
>>   	"container useRoundedCorners."
>>   	""
>>   	container setProperty: #morphHierarchy toValue: true.
>>   	container setNameTo: 'Objects Hierarchy' translated.
>>   	""
>>   	^ container!
>>
>> Item was changed:
>>   ----- Method: MorphicProject>>storeSegment (in category 'file in/out')
>> -----
>>   storeSegment
>>   	"Store my project out on the disk as an ImageSegment.  Keep the
>> outPointers in memory.  Name it <project name>.seg.  *** Caller must be
>> holding (Project alInstances) to keep subprojects from going out. ***"
>>
>>   	| is sizeHint |
>> + 	(Project current world == world) ifTrue: [^ false].
>> - 	(World == world) ifTrue: [^ false].
>>   		"self inform: 'Can''t send the current world out'."
>>   	world isInMemory ifFalse: [^ false].  "already done"
>>   	world ifNil: [^ false].  world presenter ifNil: [^ false].
>>
>>   	ScrapBook default emptyScrapBook.
>>   	World checkCurrentHandForObjectToPaste.
>>   	world releaseSqueakPages.
>>   	sizeHint := self projectParameters at: #segmentSize ifAbsent: [0].
>>
>>   	is := ImageSegment
>>   			copyFromRootsLocalFileFor: {world presenter. world}	"world, and all
>> Players"
>>   			sizeHint: sizeHint.
>>
>>   	is state = #tooBig ifTrue: [^ false].
>>   	is segment size < 2000 ifTrue: ["debugging"
>>   		Transcript show: self name, ' only ', is segment size printString,
>>   			'bytes in Segment.'; cr].
>>   	self projectParameters at: #segmentSize put: is segment size.
>>   	is extract; writeToFile: self name.
>>   	^ true!
>>
>> Item was changed:
>>   ----- Method: MorphicProject>>storeSegmentNoFile (in category 'file
>> in/out') -----
>>   storeSegmentNoFile
>>   	"For testing.  Make an ImageSegment.  Keep the outPointers in memory.
>> Also useful if you want to enumerate the objects in the segment afterwards
>> (allObjectsDo:)"
>>
>>   	| is |
>> + 	(Project current world == world) ifTrue: [^ self].		" inform: 'Can''t
>> send the current world out'."
>> - 	(World == world) ifTrue: [^ self].		" inform: 'Can''t send the current
>> world out'."
>>   	world isInMemory ifFalse: [^ self].  "already done"
>>   	world ifNil: [^ self].  world presenter ifNil: [^ self].
>>
>>   	"Do this on project enter"
>>   	World flapTabs do: [:ft | ft referent adaptToWorld: World].
>>   		"Hack to keep the Menu flap from pointing at my project"
>>   	"Preferences setPreference: #useGlobalFlaps toValue: false."
>>   	"Utilities globalFlapTabsIfAny do:
>>   		[:aFlapTab | Utilities removeFlapTab: aFlapTab keepInList: false].
>>   	Utilities clobberFlapTabList.	"
>>   	"project world deleteAllFlapArtifacts."
>>   	"self currentWorld deleteAllFlapArtifacts.	"
>>   	ScrapBook default emptyScrapBook.
>>   	World checkCurrentHandForObjectToPaste2.
>>
>>   	is := ImageSegment
>>   			copyFromRootsLocalFileFor: {world presenter. world}	"world, and all
>> Players"
>>   			sizeHint: 0.
>>
>>   	is segment size < 800 ifTrue: ["debugging"
>>   		Transcript show: self name, ' did not get enough objects'; cr.  ^
>> Beeper beep].
>>
>>   	is extract.
>>   	"is instVarAt: 2 put: is segment clone."		"different memory"!
>>
>> Item was changed:
>>   ----- Method: TheWorldMainDockingBar>>startMessageTally (in category
>> 'menu actions') -----
>>   startMessageTally
>> + 	| world |
>> + 	world := Project current world.
>>   	(self confirm: 'MessageTally will start now,
>>   and stop when the cursor goes
>>   to the top of the screen') ifTrue:
>>   		[MessageTally spyOn:
>> + 			[[Sensor peekPosition y > 0] whileTrue: [world doOneCycle]]]!
>> - 			[[Sensor peekPosition y > 0] whileTrue: [World doOneCycle]]]!
>>
>> Item was changed:
>>   ----- Method: TheWorldMenu>>startMessageTally (in category 'commands')
>> -----
>>   startMessageTally
>> + 	| world |
>> + 	world := Project current world.
>> -
>>   	(self confirm: 'MessageTally will start now,
>>   and stop when the cursor goes
>>   to the top of the screen') ifTrue:
>>   		[MessageTally spyOn:
>> + 			[[Sensor peekPosition y > 0] whileTrue: [world doOneCycle]]]!
>> - 			[[Sensor peekPosition y > 0] whileTrue: [World doOneCycle]]]!
>>
>>
>
>


More information about the Squeak-dev mailing list