On 28.04.2011 12:12, Toon Verwaest wrote:
nextPut: anObject
    "Primitive. Insert the argument at the next position in the Stream
represented by the receiver. Fail if the collection of this stream is not an Array or a String. Fail if the stream is positioned at its end, or if the position is out of bounds in the collection. Fail if the argument is not of the right type for the collection. Optional. See Object documentation
    whatIsAPrimitive."

<primitive: 66>
    position >= writeLimit
        ifTrue: [^ self pastEndPut: anObject]
        ifFalse:
            [position := position + 1.
            ^collection at: position put: anObject]

The primitive will only fail if you are trying to write past the end. This check is very fast since it's primitive... and we'll only go in Smalltalk code when it fails. The first version on the other hand is always first some smalltalk code (quite a lot for your basic example) before it goes into a slightly more heavy primitive (replaceFrom:to:with:startingAt:).
To be exact, the primitive always fails on Cog (not implemented, jitted version is just as fast), and only works for non-ReadWriteable streams on newish (last year or so) VM's :)
http://forum.world.st/Bug-in-Interpreter-gt-gt-primitiveNextPut-td788236.html

The constant overhead is still lower than nextPutAll: of course.

Cheers,
Henry





Reply via email to