generalized lvalues

Ziemowit Laski zlaski@apple.com
Fri Nov 19 01:38:00 GMT 2004


On 18 Nov 2004, at 15.44, Zack Weinberg wrote:

> Matt Austern <austern@apple.com> writes:
>
>> On Nov 18, 2004, at 3:28 PM, Ziemowit Laski wrote:
>>> The most straighforward -- and intuitive -- way of doing this is
>>> precisely via a cast applied to the lvalue, as seen above (with
>>> '__strong' expanding to an appropriate attribute).  While we have
>>> investigated some syntactic alternatives to the cast in light of
>>> the impending lvalue cast removal, all of them are counterintuitive
>>> in that they fail to express what is being done -- namely, altering
>>> the type of a variable for a particular assignment.
>
> I would like to point out that in *my* arrogant opinion, this use of
> lvalue casts is completely *un*intuitive; I would prefer either
> declaring the void * with the "this is a GC root" attribute in the
> first place, e.g.
>
>    id object;
>    void *__gcroot ptr;
>    ...
>    ptr = object;
>
> or (if for some reason that is impossible) a builtin function call,
> e.g.
>
>    id object;
>    void *ptr;
>    ...
>    __builtin_gc_register(ptr);
>    ptr = object;

Thing is, the code in AppKit and Foundation (our ObjC frameworks) 
routinely
juggles large swaths of uninitialized (and "untyped") memory which is 
then
gradually used up to hold various things, only some of which are 
pointers
to GC-able objects.  So statically typing 'ptr' in such cases is out of
the question.  Of course, in other cases, what you suggest _is_ possible
and we do it already:

     __strong void *ptr;
        :
     ptr = object;    /* write-barrier call will be generated. */

(Note the consistent way in which '__strong' is used.)

The __builtin_gc_register approach would require that the entire GC API
be redesigned, and of course would be extremely inefficient, since 
_every_
assignment in a program would have to go through a write-barrier which 
would
either do something or nothing depending on whether 
__builtin_gc_register and/or
__builtin_gc_unregister has been called.

The "cleanest" syntactic approach we could come up with so far is

   __builtin_objc_gc_strong(ptr) = object;

which I suppose we can live with, though the lhs doesn't look too 
lvaluish this way... :-(

--Zem



More information about the Gcc mailing list