Hi

Sorry about that, I think it’s meant to be:

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 newWithCollection: (self collection copyReplaceFrom: start to: 
stop with: replacementCollection)

Cheers
Carlo

On 06 May 2014, at 9:43 AM, Nicolai Hess <nicolaih...@web.de> 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.

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

Reply via email to