Sun 14 Mar 2010 02:45:49 PM UTC, original submission:
GSFFCallInvocation has a bug handling structs as parameters.
The following code:
typedef struct _PassingStructStruct
{
long long int _value;
} PassingStructStruct;
@interface PassingStructObject: NSObject
-(PassingStructStruct)testPassingStruct:(PassingStructStruct)aStruct;
-(PassingStructStruct)testPassingStructReal:(PassingStructStruct)aStruct;
@end
@implementation PassingStructObject
-(PassingStructStruct)testPassingStructReal:(PassingStructStruct)aStruct
{
NSLog(@"aStruct value=%lld",aStruct._value);
aStruct._value+=456;
return aStruct;
}
- (NSMethodSignature *)methodSignatureForSelector: (SEL)selector
{
NSLog(@"methodSignatureForSelector: %@",NSStringFromSelector(selector));
if (sel_eq(selector,@selector(testPassingStruct:)))
return [super methodSignatureForSelector:@selector(testPassingStructReal:)];
else
return [super methodSignatureForSelector:selector];
}
- (void)forwardInvocation: (NSInvocation *)invocation
{
NSLog(@"forward: %@",NSStringFromSelector([invocation selector]));
if (sel_eq([invocation selector],@selector(testPassingStruct:)))
[invocation setSelector:@selector(testPassingStructReal:)];
[invocation invoke];
}
@end
void TestPassingStruct()
{
PassingStructObject* o=AUTORELEASE([[PassingStructObject alloc]init]);
PassingStructStruct inStruct;
inStruct._value=123456789;
NSLog(@"inStruct value=%lld",inStruct._value);
PassingStructStruct retStruct=[o testPassingStruct:inStruct];
NSLog(@"retStruct value=%lld",retStruct._value);
}
produce:
inStruct value=123456789
aStruct value=0
retStruct value=456
instead of
inStruct value=123456789
aStruct value=123456789
retStruct value=123457245
The problem seems to come from GSFFCallInvocation GSInvocationCallback dunction which handle struct as struct pointer but
handle struct as struct in GSFFCallInvokeWithTargetAndImp so the parameter of the called method is wrong
|