On Jun 21, 2005, at 4:12 AM, Frederic Stark wrote:

I am sending this to gnustep-dev crossposted to gcc. Maybe this isn't the right mailing list. See at the end of the post for a 40 line program that exhibit the bad behavior.

Problem:
If a is a fault (ie: changes its isa pointer during forwardInvocation), then:

[a method1:[a method2]]

fails (a does not recognize 'method1:'), while:


I believe the GNU runtime looks up the IMP and then calls it rather than always calling a dispatch function. In this case, the code above is possibly getting miscompiled into something like

    IMP imp1 = getInstanceImp(a->isa, @selector(method1:))
    IMP imp2 = getInstanceImp(a->isa, @selector(method2))
    id result1 = imp2(a, @selector(method2))
    id result2 = imp1(a, @selector(method1:), result1)

That is, the lookup of the IMP for -method1: may be happening too early.

The code works correctly under Mac OS X.

The Apple runtime doesn't have this design choice, so it can't really have this problem.

Am I doing something horribly wrong ?

I don't think so; seems like a bug in the GNU ObjC runtime support in the compiler. I suppose the runtime maintainers might choose to define this as a bug in your code, but isa-swizzling is a fairly common and _extremely_ useful pattern in ObjC (see CoreData, NSZombie, etc.) so that'd not be my stance, obviously :)

-tim

Reply via email to