[Vm-dev] primitiveDisplayString fails on empty Strings
Eliot Miranda
eliot.miranda at gmail.com
Wed May 23 19:48:43 UTC 2018
Hi Fabio,
On Wed, May 23, 2018 at 12:11 PM, Fabio Niephaus <lists at fniephaus.com>
wrote:
>
> Hi all,
>
> I noticed that BitBlt's primitiveDisplayString fails relatively often and
> then found out that it's sometimes called to draw empty strings.
>
> `(ByteString allInstances select: [:ea | ea isEmpty]) size` revealed that
> there are 2245 empty strings in my image and I assume some of them must be
> either in the FrameRateMorph morph or in the Clock morph.
>
> Anyway...looking at BitBlt>>#primDisplayString:from:to:map:xTable:kern:,
> the fallback code basically does nothing if stopIndex is zero (`startIndex
> to: stopIndex do: ...`) which makes sense.
>
> What I think doesn't make sense is that the primitive fails in the first
> place. Instead of failing if stopIndex is not greater 0, I would suggest to
> use: `stopIndex < 1 ifTrue: [^ interpreterProxy pop: 6].` which cleans up
> the stack, leaves the receiver, and returns early.
>
> Let me know what you think!
>
I don't object. So you suggest the following?
((interpreterProxy isArray: xTable)
and: [(interpreterProxy isArray: glyphMap)
and: [(interpreterProxy slotSizeOf: glyphMap) = 256
and: [(interpreterProxy isBytes: sourceString)
and: [startIndex > 0
and: [stopIndex > 0
and: [stopIndex <= (interpreterProxy byteSizeOf: sourceString)
and: [(self loadBitBltFrom: bbObj)
and: [combinationRule ~= 30 "these two need extra source alpha"
and: [combinationRule ~= 31]]]]]]]]]) ifFalse:
[^interpreterProxy primitiveFail].
=>
((interpreterProxy isArray: xTable)
and: [(interpreterProxy isArray: glyphMap)
and: [(interpreterProxy slotSizeOf: glyphMap) = 256
and: [(interpreterProxy isBytes: sourceString)
and: [startIndex > 0
*and: [stopIndex >= 0 "to avoid failing for empty strings..."*
and: [stopIndex <= (interpreterProxy byteSizeOf: sourceString)
and: [(self loadBitBltFrom: bbObj)
and: [combinationRule ~= 30 "these two need extra source alpha"
and: [combinationRule ~= 31]]]]]]]]]) ifFalse:
[^interpreterProxy primitiveFail].
stopIndex = 0 ifTrue:
[^interpreterProxy pop: 6. "the string is empty; pop args, return rcvr"].
Any other opinions either way?
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20180523/289919fb/attachment-0001.html>
More information about the Vm-dev
mailing list