2014-05-06 17:49 GMT+02:00 <b...@openinworld.com>: > Nicolai Hess wrote: > > > > > 2014-05-06 1:17 GMT+02:00 Carlo <snoob...@gmail.com>: > >> Hi >> >> The problem seems to be due to the use of an internal collection class >> of OrderedCollection which has restrictions on use of #at:put:. This means >> that certain methods will have to delegate to the internal collection class >> to be ’safe’; in this scenario it is the XMLOrderedList >> >>copyReplaceFrom:to:with: >> >> I don’t have write access to the >> http://www.smalltalkhub.com/#!/~PharoExtras/XMLParser/ project but here >> is a unit test and code change that seems to work. >> >> Cheers >> Carlo >> >> XMLOrderedListTest>>testConcatenation >> | anXmlOrderedList expectedConcatenationResult | >> expectedConcatenationResult := XMLOrderedList new add: '1'; yourself. >> self >> shouldnt: [ anXmlOrderedList := expectedConcatenationResult , >> XMLOrderedList new ] >> raise: SubscriptOutOfBounds >> description: >> 'Expect that concatenation does not fail even though internal >> collection class of XMLOrderedList is an OrderedCollection. See comment for >> XMLOrderedList>>copyReplaceFrom:to:with:'. >> self assert: anXmlOrderedList equals: expectedConcatenationResult. >> >> >> XMLOrderedList >>copyReplaceFrom: start to: stop with: >> replacementCollection >> "Delegate to my internal collection class as it may restrict copying >> and replacing. >> See comment for OrderedCollection>>copyReplaceFrom:to:with: and >> OrderedCollection>>at:put:" >> >> ^ self collection copyReplaceFrom: start to: stop with: >> replacementCollection >> >> > > > > But the test fails :) > > XMLOrderedList >>copyReplaceFrom: start to: stop with: > replacementCollection > should return self, not the collection. > > hi Nicolas, What you say seems inconsistent with... > OrderedCollection>>copyReplaceFrom:to:with: which ends with > ^newOrderedCollection > > The test fails because... > ^ self collection copyReplaceFrom: start to: stop with: > replacementCollection > returns anOrderedCollection because /collection/ is an OrderedCollection > > What is needed is... > ^ self newWithCollection: (collection copyReplaceFrom: start to: stop > with: replacementCollection). > which returns anXMLOrderedList. > > cheers -ben > > > > XMLOrderedList >>copyReplaceFrom: start to: stop with: > replacementCollection > "Delegate to my internal collection class as it may restrict copying and > replacing. > See comment for OrderedCollection>>copyReplaceFrom:to:with: and > OrderedCollection>>at:put:" > > self collection copyReplaceFrom: start to: stop with: > replacementCollection. > > > > > > > > >> >> On 05 May 2014, at 7:13 PM, Ben Coman <b...@openinworld.com> wrote: >> >> >> Thanks. That info made it much easier to try. Sorry I didn't end up with >> an answer for you, but I confirm there is some issue here, or something new >> I can learn when other chip in. >> >> Here is what I tried. >> >> * Installed XMLParser (monty.58) from Configuration Browser in Pharo 3. >> >> * Ran your code. Got the same error. >> >> * From the call stack I observed that >> XMLOrderedCollection(SequenceableCollection)>>copyReplaceFrom:to:with: >> has the line "newSequenceableCollection := self species new: newSize." >> such that it seems your error might be reduced to the question of why the >> following two snippets fail: >> d := OrderedCollection new: 1. >> d at: 1 put: 1. >> >> e := OrderedCollection new: 3. >> e at: 2 put: 1. >> >> However I'm sorry that is beyond my knowledge, and I'm hoping someone >> else can chip in so I can learn something. >> >> Pushing on, I noticed that XMLOrderedList has an instance variable >> /collection/ which holds the OrderedCollection. >> >> Now I wonder (without great experience and hoping to learn something) if >> it smells funny that XMLOrderedList inherits all of SequencableCollection >> methods that can not operate on /collection/. >> >> I noticed that XMLOrderedList was using an inherited >> SequenceableCollection>>copyReplaceFrom:to:with >> while OrderedCollection overrode that method with its own. So taking >> inspiration XMLOrderedList>>copyFrom:to: to override >> SequencableCollection>>copyReplaceFrom:to:with: to work with /collection/ >> seems to solve your problem: >> XMLOrderedList>>copyReplaceFrom: start to: stop with: >> replacementCollection >> ^ self newWithCollection: >> (collection copyReplaceFrom: start to: stop with: >> replacementCollection ) >> >> >> Along the way I noticed a few (possible) bugs that seems not related to >> your problem: >> >> * When stepping through XMLOrderedList>>setCollection: >> there is a red-box-of-death for the instance variables, which can be >> solved by defining the following. >> XMLOrderedList>>size >> ^ collection ifNil: [ 0 ] ifNotNil: [ collection size] >> >> * In the debugger the /collection/ instance variable is not shown! (e.g. >> line XMLOrderedList>>at:put:). >> Can someone confirm this should show? >> >> HTH >> cheers -ben >> >> Thushar G R wrote: >> >> XMLOrderedList belongs to package XML-Parser-Nodes. >> >> a := XMLOrderedList new. >> a add:'1'. >> a , XMLOrderedList new. >> >> Here select all and Do it. On line 3 (a , XMLOrderedList new.) i am >> expected to get a copy of 'a' , but instead it throws an error >> SubscriptOutOfBounds. >> >> >> >> >> OrderedCollection(Object)>>errorSubscriptBounds: >> OrderedCollection>>ensureBoundsFrom:to: >> OrderedCollection>>at:put: >> OrderedCollection(SequenceableCollection)>>replaceFrom:to:with:startingAt: >> XMLOrderedList>>replaceFrom:to:with:startingAt: >> XMLOrderedList(SequenceableCollection)>>copyReplaceFrom:to:with: >> XMLOrderedList(SequenceableCollection)>>, >> UndefinedObject>>DoIt >> OpalCompiler>>evaluate >> SmalltalkEditor>>evaluateSelectionAndDo: >> PluggableTextMorph>>inspectIt in Block: [ textMorph editor >> evaluateSelectionAndDo: [ :resu...etc... >> PluggableTextMorph>>handleEdit: in Block: [ result := editBlock value ] >> TextMorphForEditView(TextMorph)>>handleEdit: >> PluggableTextMorph>>handleEdit: >> PluggableTextMorph>>inspectIt >> SmalltalkEditor class>>buildSmalltalkEditorKeymappingsOn: in Block: [ >> :morph | morph inspectIt ] >> BlockClosure>>cull: >> BlockClosure>>cull:cull: >> BlockClosure>>cull:cull:cull: >> KMCategoryBinding>>completeMatch:buffer: >> KMKeymap>>notifyCompleteMatchTo:buffer: in Block: [ :l | l completeMatch: >> self buffer: aBuffer ] >> Array(SequenceableCollection)>>do: >> KMKeymap>>notifyCompleteMatchTo:buffer: >> KMKeymap>>onMatchWith:notify:andDo: >> KMCategory>>onMatchWith:notify:andDo: in Block: [ :entry | entry >> onMatchWith: anEventBuffer notify...etc... >> Set>>do: >> KMCategory>>onMatchWith:notify:andDo: >> KMCategoryBinding>>verifyMatchWith:notifying:thenDoing: >> KMDispatcher>>dispatch: in Block: [ :aTarget | ... >> OrderedCollection>>do: >> >> >> Plese refer to the above stack. >> >> Thanks in advance. >> >> thushar >> >> >> On Mon, May 5, 2014 at 6:28 PM, Ben Coman <b...@openinworld.com> wrote: >> >>> Thushar G R wrote: >>> >>>> Hi, >>>> >>>> I am getting an error while doing this. >>>> >>>> a := XMLOrderedList new. >>>> a add:'1'. >>>> a , XMLOrderedList new. >>>> >>>> Thanks, >>>> >>>> Thushar >>>> >>> I could give you "an answer" ;) - but it would be what you wanted. It >>> would help if you told what the error was, where it occurs (which of the >>> three lines), and what you expect each line is doing (especially the third >>> line). >>> >>> Also I don't see XMLOrderedList in the default Pharo image, so it would >>> help if you describe where you got that from and how you installed it. >>> >>> cheers -ben >>> >>> >> >> >> > >
Yes, you are right. I just stumbled on the wrong return type and assumed it should return "self". But you are right if other collections return a copy of self.