Hi
I don't know if this was reported. Apparently there is a problem when migrating a large number of instances, I have aprox. 270,000 instances from which I simply pulled up an ivar in their class to a higher superclass, and a PrimitiveFailed raised.
It can be reproduced by installing Territorial in Pharo 5.0 with Spur VM 5.0 from 4 May 2016 in Windows 8.1 (this is the standard image installed using wget command line in msys).
Gofer it smalltalkhubUser: 'hernan' project: 'Territorial'; configuration; loadDevelopment. TCityOrganization addOpenGeoCode
Then manually install Territorial-HernanMoralesDurand.163 from Monticello. Backwards (installing .163, populating, then .166) also reproduces the issue.
Is there a fix for this?
--- The full stack --- Array(Object)>>primitiveFailed: Array(Object)>>primitiveFailed Array>>elementsForwardIdentityTo: TerritorialCity class(ClassDescription)>>updateInstances:from:isMeta: TerritorialCity class(ClassDescription)>>updateInstancesFrom: PharoClassInstaller>>updateClass:to: [ 1 to: old size do: [ :index | self updateClass: (old at: index) to: (new at: index) ]. old elementsForwardIdentityTo: new. " Garbage collect away the zombie instances left behind in garbage memory in #updateInstancesFrom: " " If we don't clean up this garbage, a second update would revive them with a wrong layout! " " (newClass rather than oldClass, since they are now both newClass) " Smalltalk garbageCollect ] in PharoClassInstaller>>migrateClasses:to:using: BlockClosure>>ensure: BlockClosure>>valueUnpreemptively PharoClassInstaller>>migrateClasses:to:using: SlotClassBuilder>>migrateClasses: SlotClassBuilder>>apply: SlotClassBuilder>>build PharoClassInstaller class(AbstractClassInstaller class)>>make: [ PharoClassInstaller make: [ :builder | builder superclass: superClass; name: name; layoutClass: (ObjectLayout layoutForType: type); slots: self instanceVariables; sharedVariables: self classVariables; sharedPools: self sharedPoolsString; classSlots: self classInstanceVariables; traitComposition: self traitCompositionCompiled; classTraitComposition: self classTraitCompositionCompiled; comment: comment stamp: commentStamp; category: category; environment: superClass environment ] ] in MCClassDefinition>>createClass BlockClosure>>on:do: MCClassDefinition>>createClass MCClassDefinition>>load MCClassDefinition(MCDefinition)>>addMethodAdditionTo: [ :each | each addMethodAdditionTo: methodAdditions ] in MCPackageLoader>> basicLoadDefinitions [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] in [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>
do:displayingProgress:every:
OrderedCollection>>do: [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>
do:displayingProgress:every:
BlockClosure>>cull: [ ^ block cull: self ] in [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run [ p psValueAt: index put: anObject. aBlock value ] in CurrentJob(DynamicVariable)>>value:during: BlockClosure>>ensure: CurrentJob(DynamicVariable)>>value:during: CurrentJob class(DynamicVariable class)>>value:during: [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run BlockClosure>>ensure: Job>>run MorphicUIManager(UIManager)>>displayProgress:from:to:during: ByteString(String)>>displayProgressFrom:to:during: OrderedCollection(Collection)>>do:displayingProgress:every: OrderedCollection(Collection)>>do:displayingProgress: MCPackageLoader>>basicLoadDefinitions [ self basicLoadDefinitions ] in [ self handleLoadErrorsDuring: [ self basicLoadDefinitions ] ] in MCPackageLoader>>basicLoad BlockClosure>>on:do: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ aBlock on: InMidstOfFileinNotification do: [ :notification | notification resume: true ] ] in MCPackageLoader>> handleLoadErrorsDuring: BlockClosure>>on:do: MCPackageLoader>>handleLoadErrorsDuring: [ self handleLoadErrorsDuring: [ self basicLoadDefinitions ] ] in MCPackageLoader>>basicLoad BlockClosure>>ensure: MCPackageLoader>>basicLoad [ self basicLoad ] in MCPackageLoader>>loadWithNameLike: BlockClosure>>ensure: MCPackageLoader>>useChangeSetNamed:during: MCPackageLoader>>useNewChangeSetNamedLike:during: MCPackageLoader>>loadWithNameLike: MCThreeWayMerger(MCMerger)>>loadWithNameLike: MCVersionMerger>>mergeWithNameLike: MCVersionMerger class>>mergeVersion: MCVersion>>merge MCFileRepositoryInspector(MCVersionInspector)>>merge MCFileRepositoryInspector>>merge MCFileRepositoryInspector(MCTool)>>performButtonAction:enabled: PluggableButtonMorph>>performAction: [ :m | (m containsPoint: evt cursorPoint) ifTrue: [ m enabled ifTrue: [ m performAction: evt ] ] ] in PluggableButtonMorph>>mouseUp: Array(SequenceableCollection)>>do: PluggableButtonMorph>>mouseUp: PluggableButtonMorph(Morph)>>handleMouseUp: MouseButtonEvent>>sentTo: PluggableButtonMorph(Morph)>>handleEvent: PluggableButtonMorph(Morph)>>handleFocusEvent: [ ActiveHand := self. ActiveEvent := anEvent. result := focusHolder handleFocusEvent: (anEvent transformedBy: (focusHolder transformedFrom: self)) ] in HandMorph>>sendFocusEvent:to:clear: BlockClosure>>on:do: WorldMorph(PasteUpMorph)>>becomeActiveDuring: HandMorph>>sendFocusEvent:to:clear: HandMorph>>sendEvent:focus:clear: HandMorph>>sendMouseEvent: HandMorph>>handleEvent: HandMorph>>processEvents [ :h | ActiveHand := h. h processEvents. ActiveHand := nil ] in WorldState>>doOneCycleNowFor: Array(SequenceableCollection)>>do: WorldState>>handsDo: WorldState>>doOneCycleNowFor: WorldState>>doOneCycleFor: WorldMorph>>doOneCycle [ [ World doOneCycle. Processor yield. false ] whileFalse: [ ] ] in MorphicUIManager>>spawnNewProcess [ self value. Processor terminateActive ] in BlockClosure>>newProcess ------------------------------------------------------------ -------------------
Hernán
Yes, you need a new VM built from Cog sources after June, hopefully a newer can be promoted to stable soon...
https://pharo.fogbugz.com/f/cases/18711/Cannot-commit-a-special-character-in...
Cheers, Henry
On 21 Sep 2016, at 7:19 , Hernán Morales Durand hernan.morales@gmail.com wrote:
Hi
I don't know if this was reported. Apparently there is a problem when migrating a large number of instances, I have aprox. 270,000 instances from which I simply pulled up an ivar in their class to a higher superclass, and a PrimitiveFailed raised.
It can be reproduced by installing Territorial in Pharo 5.0 with Spur VM 5.0 from 4 May 2016 in Windows 8.1 (this is the standard image installed using wget command line in msys).
Gofer it smalltalkhubUser: 'hernan' project: 'Territorial'; configuration; loadDevelopment. TCityOrganization addOpenGeoCode
Then manually install Territorial-HernanMoralesDurand.163 from Monticello. Backwards (installing .163, populating, then .166) also reproduces the issue.
Is there a fix for this?
--- The full stack --- Array(Object)>>primitiveFailed: Array(Object)>>primitiveFailed Array>>elementsForwardIdentityTo: TerritorialCity class(ClassDescription)>>updateInstances:from:isMeta: TerritorialCity class(ClassDescription)>>updateInstancesFrom: PharoClassInstaller>>updateClass:to: [ 1 to: old size do: [ :index | self updateClass: (old at: index) to: (new at: index) ]. old elementsForwardIdentityTo: new. " Garbage collect away the zombie instances left behind in garbage memory in #updateInstancesFrom: " " If we don't clean up this garbage, a second update would revive them with a wrong layout! " " (newClass rather than oldClass, since they are now both newClass) " Smalltalk garbageCollect ] in PharoClassInstaller>>migrateClasses:to:using: BlockClosure>>ensure: BlockClosure>>valueUnpreemptively PharoClassInstaller>>migrateClasses:to:using: SlotClassBuilder>>migrateClasses: SlotClassBuilder>>apply: SlotClassBuilder>>build PharoClassInstaller class(AbstractClassInstaller class)>>make: [ PharoClassInstaller make: [ :builder | builder superclass: superClass; name: name; layoutClass: (ObjectLayout layoutForType: type); slots: self instanceVariables; sharedVariables: self classVariables; sharedPools: self sharedPoolsString; classSlots: self classInstanceVariables; traitComposition: self traitCompositionCompiled; classTraitComposition: self classTraitCompositionCompiled; comment: comment stamp: commentStamp; category: category; environment: superClass environment ] ] in MCClassDefinition>>createClass BlockClosure>>on:do: MCClassDefinition>>createClass MCClassDefinition>>load MCClassDefinition(MCDefinition)>>addMethodAdditionTo: [ :each | each addMethodAdditionTo: methodAdditions ] in MCPackageLoader>>basicLoadDefinitions [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] in [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>>do:displayingProgress:every: OrderedCollection>>do: [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [ oldLabel ]) ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>>do:displayingProgress:every: BlockClosure>>cull: [ ^ block cull: self ] in [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run [ p psValueAt: index put: anObject. aBlock value ] in CurrentJob(DynamicVariable)>>value:during: BlockClosure>>ensure: CurrentJob(DynamicVariable)>>value:during: CurrentJob class(DynamicVariable class)>>value:during: [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run BlockClosure>>ensure: Job>>run MorphicUIManager(UIManager)>>displayProgress:from:to:during: ByteString(String)>>displayProgressFrom:to:during: OrderedCollection(Collection)>>do:displayingProgress:every: OrderedCollection(Collection)>>do:displayingProgress: MCPackageLoader>>basicLoadDefinitions [ self basicLoadDefinitions ] in [ self handleLoadErrorsDuring: [ self basicLoadDefinitions ] ] in MCPackageLoader>>basicLoad BlockClosure>>on:do:
- - - - - - - - - - - - - - - - - -
[ aBlock on: InMidstOfFileinNotification do: [ :notification | notification resume: true ] ] in MCPackageLoader>>handleLoadErrorsDuring: BlockClosure>>on:do: MCPackageLoader>>handleLoadErrorsDuring: [ self handleLoadErrorsDuring: [ self basicLoadDefinitions ] ] in MCPackageLoader>>basicLoad BlockClosure>>ensure: MCPackageLoader>>basicLoad [ self basicLoad ] in MCPackageLoader>>loadWithNameLike: BlockClosure>>ensure: MCPackageLoader>>useChangeSetNamed:during: MCPackageLoader>>useNewChangeSetNamedLike:during: MCPackageLoader>>loadWithNameLike: MCThreeWayMerger(MCMerger)>>loadWithNameLike: MCVersionMerger>>mergeWithNameLike: MCVersionMerger class>>mergeVersion: MCVersion>>merge MCFileRepositoryInspector(MCVersionInspector)>>merge MCFileRepositoryInspector>>merge MCFileRepositoryInspector(MCTool)>>performButtonAction:enabled: PluggableButtonMorph>>performAction: [ :m | (m containsPoint: evt cursorPoint) ifTrue: [ m enabled ifTrue: [ m performAction: evt ] ] ] in PluggableButtonMorph>>mouseUp: Array(SequenceableCollection)>>do: PluggableButtonMorph>>mouseUp: PluggableButtonMorph(Morph)>>handleMouseUp: MouseButtonEvent>>sentTo: PluggableButtonMorph(Morph)>>handleEvent: PluggableButtonMorph(Morph)>>handleFocusEvent: [ ActiveHand := self. ActiveEvent := anEvent. result := focusHolder handleFocusEvent: (anEvent transformedBy: (focusHolder transformedFrom: self)) ] in HandMorph>>sendFocusEvent:to:clear: BlockClosure>>on:do: WorldMorph(PasteUpMorph)>>becomeActiveDuring: HandMorph>>sendFocusEvent:to:clear: HandMorph>>sendEvent:focus:clear: HandMorph>>sendMouseEvent: HandMorph>>handleEvent: HandMorph>>processEvents [ :h | ActiveHand := h. h processEvents. ActiveHand := nil ] in WorldState>>doOneCycleNowFor: Array(SequenceableCollection)>>do: WorldState>>handsDo: WorldState>>doOneCycleNowFor: WorldState>>doOneCycleFor: WorldMorph>>doOneCycle [ [ World doOneCycle. Processor yield. false ] whileFalse: [ ] ] in MorphicUIManager>>spawnNewProcess [ self value. Processor terminateActive ] in BlockClosure>>newProcess
Hernán
Thank you Henrik, I will wait to a new stable version as the problem does not affect too much my workflow. Cheers,
Hernán
2016-09-21 6:03 GMT-03:00 Henrik Johansen henrik.s.johansen@veloxit.no:
Yes, you need a new VM built from Cog sources after June, hopefully a newer can be promoted to stable soon...
https://pharo.fogbugz.com/f/cases/18711/Cannot-commit-a- special-character-into-Monticello
Cheers, Henry
On 21 Sep 2016, at 7:19 , Hernán Morales Durand <
hernan.morales@gmail.com> wrote:
Hi
I don't know if this was reported. Apparently there is a problem when
migrating a large number of instances, I have aprox. 270,000 instances from which I simply pulled up an ivar in their class to a higher superclass, and a PrimitiveFailed raised.
It can be reproduced by installing Territorial in Pharo 5.0 with Spur VM
5.0 from 4 May 2016 in Windows 8.1 (this is the standard image installed using wget command line in msys).
Gofer it smalltalkhubUser: 'hernan' project: 'Territorial'; configuration; loadDevelopment. TCityOrganization addOpenGeoCode
Then manually install Territorial-HernanMoralesDurand.163 from
Monticello. Backwards (installing .163, populating, then .166) also reproduces the issue.
Is there a fix for this?
--- The full stack --- Array(Object)>>primitiveFailed: Array(Object)>>primitiveFailed Array>>elementsForwardIdentityTo: TerritorialCity class(ClassDescription)>>updateInstances:from:isMeta: TerritorialCity class(ClassDescription)>>updateInstancesFrom: PharoClassInstaller>>updateClass:to: [ 1 to: old size do: [ :index | self updateClass: (old at: index) to:
(new at: index) ].
old elementsForwardIdentityTo: new. " Garbage collect away the zombie instances left behind in garbage
memory in #updateInstancesFrom: "
" If we don't clean up this garbage, a second update would revive them
with a wrong layout! "
" (newClass rather than oldClass, since they are now both newClass) " Smalltalk garbageCollect ] in PharoClassInstaller>>
migrateClasses:to:using:
BlockClosure>>ensure: BlockClosure>>valueUnpreemptively PharoClassInstaller>>migrateClasses:to:using: SlotClassBuilder>>migrateClasses: SlotClassBuilder>>apply: SlotClassBuilder>>build PharoClassInstaller class(AbstractClassInstaller class)>>make: [ PharoClassInstaller make: [ :builder | builder superclass: superClass; name: name; layoutClass: (ObjectLayout layoutForType: type); slots: self instanceVariables; sharedVariables: self classVariables; sharedPools: self sharedPoolsString; classSlots: self classInstanceVariables; traitComposition: self traitCompositionCompiled; classTraitComposition: self classTraitCompositionCompiled; comment: comment stamp: commentStamp; category: category; environment: superClass environment ] ] in
MCClassDefinition>>createClass
BlockClosure>>on:do: MCClassDefinition>>createClass MCClassDefinition>>load MCClassDefinition(MCDefinition)>>addMethodAdditionTo: [ :each | each addMethodAdditionTo: methodAdditions ] in
MCPackageLoader>>basicLoadDefinitions
[ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs ] ]) ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [
oldLabel ])
ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ].
aBlock value: each. count := count + 1 ] in [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs
] ])
ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [
oldLabel ])
ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>
do:displayingProgress:every: OrderedCollection>>do: [ :bar | labelBlock := aStringOrBlock isString ifTrue: [ bar label: aStringOrBlock. [ :dummyItem | aStringOrBlock ] ] ifFalse: [ aStringOrBlock ]. self do: [ :each | | newLabel | "Special handling for first and last element" (count = 0 or: [ count + 1 = size or: [ (Time millisecondsSince: lastUpdate) >= msecs
] ])
ifTrue: [ bar current: count. oldLabel = (newLabel := (labelBlock cull: each) ifNil: [
oldLabel ])
ifFalse: [ bar label: newLabel. oldLabel := newLabel ]. lastUpdate := Time millisecondClockValue ]. aBlock value: each. count := count + 1 ] ] in OrderedCollection(Collection)>
do:displayingProgress:every: BlockClosure>>cull: [ ^ block cull: self ] in [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run [ p psValueAt: index put: anObject. aBlock value ] in CurrentJob(DynamicVariable)>>value:during: BlockClosure>>ensure: CurrentJob(DynamicVariable)>>value:during: CurrentJob class(DynamicVariable class)>>value:during: [ self prepareForRunning. CurrentJob value: self during: [ ^ block cull: self ] ] in Job>>run BlockClosure>>ensure: Job>>run MorphicUIManager(UIManager)>>displayProgress:from:to:during: ByteString(String)>>displayProgressFrom:to:during: OrderedCollection(Collection)>>do:displayingProgress:every: OrderedCollection(Collection)>>do:displayingProgress: MCPackageLoader>>basicLoadDefinitions [ self basicLoadDefinitions ] in [ self handleLoadErrorsDuring: [ self
basicLoadDefinitions ] ] in MCPackageLoader>>basicLoad
BlockClosure>>on:do:
- - - - - - - - - - - - - - - - - -
[ aBlock on: InMidstOfFileinNotification do: [ :notification | notification resume: true ] ] in
MCPackageLoader>>handleLoadErrorsDuring:
BlockClosure>>on:do: MCPackageLoader>>handleLoadErrorsDuring: [ self handleLoadErrorsDuring: [ self basicLoadDefinitions ] ] in
MCPackageLoader>>basicLoad
BlockClosure>>ensure: MCPackageLoader>>basicLoad [ self basicLoad ] in MCPackageLoader>>loadWithNameLike: BlockClosure>>ensure: MCPackageLoader>>useChangeSetNamed:during: MCPackageLoader>>useNewChangeSetNamedLike:during: MCPackageLoader>>loadWithNameLike: MCThreeWayMerger(MCMerger)>>loadWithNameLike: MCVersionMerger>>mergeWithNameLike: MCVersionMerger class>>mergeVersion: MCVersion>>merge MCFileRepositoryInspector(MCVersionInspector)>>merge MCFileRepositoryInspector>>merge MCFileRepositoryInspector(MCTool)>>performButtonAction:enabled: PluggableButtonMorph>>performAction: [ :m | (m containsPoint: evt cursorPoint) ifTrue: [ m enabled ifTrue: [ m performAction: evt ] ] ] in
PluggableButtonMorph>>mouseUp:
Array(SequenceableCollection)>>do: PluggableButtonMorph>>mouseUp: PluggableButtonMorph(Morph)>>handleMouseUp: MouseButtonEvent>>sentTo: PluggableButtonMorph(Morph)>>handleEvent: PluggableButtonMorph(Morph)>>handleFocusEvent: [ ActiveHand := self. ActiveEvent := anEvent. result := focusHolder handleFocusEvent: (anEvent transformedBy: (focusHolder
transformedFrom: self)) ] in HandMorph>>sendFocusEvent:to:clear:
BlockClosure>>on:do: WorldMorph(PasteUpMorph)>>becomeActiveDuring: HandMorph>>sendFocusEvent:to:clear: HandMorph>>sendEvent:focus:clear: HandMorph>>sendMouseEvent: HandMorph>>handleEvent: HandMorph>>processEvents [ :h | ActiveHand := h. h processEvents. ActiveHand := nil ] in WorldState>>doOneCycleNowFor: Array(SequenceableCollection)>>do: WorldState>>handsDo: WorldState>>doOneCycleNowFor: WorldState>>doOneCycleFor: WorldMorph>>doOneCycle [ [ World doOneCycle. Processor yield. false ] whileFalse: [ ] ] in MorphicUIManager>>spawnNewProcess [ self value. Processor terminateActive ] in BlockClosure>>newProcess
Hernán
vm-dev@lists.squeakfoundation.org