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