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