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 <[email protected]> wrote:
2014-05-06 1:17 GMT+02:00 Carlo <[email protected]>:
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 <[email protected]> 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 <[email protected]> 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