[squeak-dev] Re: becomeForward: alternative

Eliot Miranda eliot.miranda at gmail.com
Thu Sep 18 16:57:12 UTC 2008


On Thu, Sep 18, 2008 at 9:44 AM, Rob Withers <reefedjib at yahoo.com> wrote:

>  :-)
>
> I just compiled with:
>
>  (twoWayFlag not and: [copyHashFlag not])
>   ifTrue: [(self containOnlyOops: array1) ifFalse: [^false]]
>   ifFalse: [(self containOnlyOops: array1 and: array2) ifFalse: [^false]].
> but I like your positive logic better.  Thanks!
>

Forgive me, you've got me started :)  I hate it when people don't cut down
on their conditionals.  I saw this the other day (won't tell you where) and
it drives me *batty*.

    if((options & LINK_OPTION_PRIVATE) == LINK_OPTION_PRIVATE)
        object_image->image.private = TRUE;
    else
        object_image->image.private = FALSE;

the following takes 25% of the vertical real estate and says it better.

        object_image->image.private = options & LINK_OPTION_PRIVATE) ==
LINK_OPTION_PRIVATE;

Even worse is the following idiom:

        if(print_addresses == TRUE)

I mean if you're that doubtful surely you want to use belt-and-braces and
write

        if(((print_addresses == TRUE) == TRUE) == TRUE)

to be free of anxiety.


> Rob
>
> ----- Original Message -----
> *From:* Eliot Miranda <eliot.miranda at gmail.com>
> *To:* The general-purpose Squeak developers list<squeak-dev at lists.squeakfoundation.org>
> *Sent:* Thursday, September 18, 2008 12:41 PM
> *Subject:* Re: [squeak-dev] Re: becomeForward: alternative
>
> Things work fine provided the become is one-way and hashes are not copied.
>  Simply change
>         (self containOnlyOops: array1 and: array2) ifFalse: [^false]
>
> in ObjectMemory>>become:with:twoWay:copyHash: to
>
> (twoWayFlag or: [copyHashFlag])
> ifTrue: [(self containOnlyOops: array1 and: array2) ifFalse: [^false]]
> ifFalse: [(self containOnlyOops: array1) ifFalse: [^false]].
>
> along with the obvious implementation of containOnlyOops:.
> If so,
>  | foo bar |
> foo := 1 at 2.
> bar := { foo. foo }.
> foo becomeForward: 0 copyHash: false.
> { foo. bar }
> produces
> #(0 #(0 0))
>
> On Thu, Sep 18, 2008 at 9:09 AM, Rob Withers <reefedjib at yahoo.com> wrote:
>
>>
>> ----- Original Message ----- From: "Paolo Bonzini" <bonzini at gnu.org>
>> To: "The general-purpose Squeak developers list" <
>> squeak-dev at lists.squeakfoundation.org>
>> Sent: Tuesday, September 16, 2008 3:59 PM
>> Subject: [squeak-dev] Re: becomeForward: alternative
>>
>>
>>
>> Rob Withers wrote:
>>>
>>>> I am trying to becomeForward with an object and a small integer.  This
>>>> of course doesn't work.  Is there an alternative that would allow me to
>>>> do this?
>>>>
>>>
>>> There's actually no reason why the *destination* of a becomeForward:
>>> cannot be a SmallInteger.  It's a VM bug in my opinion.
>>>
>>>
>> Thanks, Paolo.
>>
>> I tried looking into this a bit and here is what I have found.  First off,
>> this will only work with
>>   #elementsForwardIdentityTo: anArrayWithSmallIntegers copyHash: false.
>> It would not work to copy the source hash to a SmallInteger.
>>
>> Next is understanding forwarding blocks and the process of remapping
>> objects using them.  There are three steps:
>>   1) #prepareForwardingTableForBecoming:with:twoWay:  "create and init
>> forwarding blocks, and install into original headers"
>>   2) #mapPointersInObjectsFrom:to:  "point pointers to forwarded oop"
>>   3) #restoreHeadersAfterForwardBecome: "restore original headers"
>> The question seems to come down to the following.  Can forwarding blocks
>> point to SmallIntegers?
>>
>> Rob
>>
>> Paolo
>>>
>>>
>>
>>
>  ------------------------------
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20080918/7655acaf/attachment.htm


More information about the Squeak-dev mailing list