On Fri, Oct 23, 2009 at 4:34 PM, David Chisnall <thera...@sucs.org> wrote:

> Hi Stef,
>
> Having an implementation of Core Foundation would be nice, but I believe
> your approach is wrong.
>

That is a definite possibility! :)

 These are the requirements I started out with:
* Successfully compile the EXRange example in CF-Lite's CFRuntime.h;
* Pass CF and NS objects freely (the ones that have corresponding NS
classes, at least).

First, please do not use the info field in the class structure for anything.
>  That field is for the runtime to use.  The GCC runtime uses several of
> them, the GNUstep runtime uses a few more.  It should not be used; there is
> no guarantee that future runtime versions won't use them all.
>

I guess I should explain, I was only going to use the CLS_GETNUMBER() macro
in objc-api.h (that is, only the top half of the info field).  I also
noticed that this macros, when written out, doing: ((sizeof(long)*8)/2)...
wouldn't ((sizeof(long)<<3)>>1) be a lot faster?  Specially on RISC
archtectures?  My C programming book suggests that when multiplying or
dividing by a multiple of 2^x a shift is often better than a
multiply/divide.

With regard to the CFTypeID, this should be the address of the class
> structure.  For those unfamiliar with how CoreFoundation works:
>

That includes me... the only thing I have to go by is CF-Lite's CFRuntime.h
and the CF docs.


> Each of the CF classes has an isa pointer, just like an Objective-C object.
>  Unlike Objective-C objects, this is set to a value below 64KB, which is
> guaranteed not to be the address of a real class.  This number is the
> CFTypeID, which is a pseudo-class.
>
> The reason that is that Apple's CoreFoundation does not depend on libobjc
> (although it does link to it).  If you use CF without libobjc, then you use
> static dispatch for all of the CF calls.  When you call CFSomething() the
> function checks that the object's isa pointer is set to the magic constant
> that it expects and if not then it calls another function (via some ugly
> macros).  This is done so CF objects can be used without relying on libobjc
> having finished loading classes.
>
> If you use Objective-C then you get the toll-free bridging.  If you send a
> message to an object with an isa pointer that is less than 2^16, then the
> runtime uses a special lookup mechanism.  If you call a CF function with an
> object with an isa pointer above 2^16, it bounces it to the Objective-C
> runtime for looking up the method (this is how, for example, you can use
> CFString functions on your own NSString subclass).
>

Hmm... that's an interesting.

Unless you want to use CF for some very low-level stuff, then there is
> really no point in copying this.  You can just:
>
> 1) Define Objective-C classes that implement the CF types (many of these
> already exist in GNUstep).
> 2) Write wrapper functions that call the ObjC methods.
> 3) Return the address of the class as the isa pointer.
>
> This will then work with all code that uses CF types unless they either
> rely on the TypeID < 2^16 thing or uses CF functions in +load or
> __attribute__((constructor)) functions.
>
> Most of the CF equivalents of class methods take a CFAllocator.  You can
> declare this as a typedef from NSZone; they are functionally equivalent.
>  For a first pass, you can just implement most of the CF functions as
> trivial Objective-C functions, for example:
>
> typedef NSArray *CFArrayRef;
> typedef NSZone *CFAllocatorRef;
>

And here's where I ran into some problems... apparently, CFAllocatorRef is
considered a class (responds to CFGetTypeID()), but isn't one in GNUstep.
Also, it allows users to define they're own with CFAllocatorCreate(), which
takes a CFAllocatorContext.  I might just have to not allow that if this is
the case.

CFArrayRef CFArrayCreateCopy(CFAllocatorRef allocator, CFArrayRef theArray)
> {
>        [(NSArray*)theArray copyWithZone: allocator];
> }
>

I was going with objc_msg_lookup, I figured I could do everything in pure C
that way.  But I guess this will work, too.  This is why I put it out at
this stage, so I don't follow the wrong path for too long.

Once this is working, then you can start worrying about optimising it.  You
> might also consider making these in static inline functions in the header
> wrapped in #ifdef __OBJC__ so that people using CF functions in ObjC call
> the real methods.
>
> I wrote some macros for declaring / defining these CF functions a while
> back, which I can send you if you're interested, and I'm happy to review any
> code you're working on.
>

Definitely, for both those statement!  I'll clean up what I have in
CFRuntime.c and CFBase.c (I'm pretty sure only I can understand the mess in
there), and have you take a look.

At this point, I'm really not sure what the correct way ahead should be.
I'm hoping I'll get some more feedback so that I can make an informed
decision.

Stefan
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
http://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to