Nicolai Hess wrote:hi Nicolas, What you say seems inconsistent with...
2014-05-06 1:17 GMT+02:00 Carlo <snoobabk@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.
CheersCarlo
XMLOrderedListTest>>testConcatenation| anXmlOrderedList expectedConcatenationResult |expectedConcatenationResult := XMLOrderedList new add: '1'; yourself.selfshouldnt: [ anXmlOrderedList := expectedConcatenationResult , XMLOrderedList new ]raise: SubscriptOutOfBoundsdescription:'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.
OrderedCollection>>copyReplaceFrom:to:with:������ which ends with ������
������ ^newOrderedCollection
The test fails because...������ ^ self collection copyReplaceFrom: start to: stop with: replacementCollectionreturns 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 <btc@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>>DoItOpalCompiler>>evaluateSmalltalkEditor>>evaluateSelectionAndDo:PluggableTextMorph>>inspectIt in Block: [ textMorph editor evaluateSelectionAndDo: [ :resu...etc...PluggableTextMorph>>handleEdit: in Block: [ result := editBlock value ]TextMorphForEditView(TextMorph)>>handleEdit:PluggableTextMorph>>handleEdit:PluggableTextMorph>>inspectItSmalltalkEditor 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 <btc@openinworld.com> wrote:
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).Thushar G R wrote:
Hi,
I am getting an error while doing this.
a := XMLOrderedList new.
a add:'1'.
a , XMLOrderedList new.
Thanks,
Thushar
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