1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/Target.m Sat Mar 08 21:04:41 2008 -0800
1.3 @@ -0,0 +1,53 @@
1.4 +//
1.5 +// Target.m
1.6 +// MYUtilities
1.7 +//
1.8 +// Created by Jens Alfke on 2/11/08.
1.9 +// Copyright 2008 Jens Alfke. All rights reserved.
1.10 +//
1.11 +
1.12 +#import "Target.h"
1.13 +
1.14 +
1.15 +NSInvocation* _mktarget( id rcvr, SEL action )
1.16 +{
1.17 + NSMethodSignature *sig = [rcvr methodSignatureForSelector: action];
1.18 + CAssert(sig,@"%@<%p> does not respond to %@",[rcvr class],rcvr,NSStringFromSelector(action));
1.19 + CAssert(sig.numberOfArguments==3,
1.20 + @"-[%@ %@] can't be used as a target because it takes >1 param",
1.21 + [rcvr class],NSStringFromSelector(action));
1.22 + CAssert(0==strcmp([sig getArgumentTypeAtIndex: 2],"@"),
1.23 + @"-[%@ %@] can't be used as a target because it takes a non-object param",
1.24 + [rcvr class],NSStringFromSelector(action));
1.25 + NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sig];
1.26 + inv.target = rcvr;
1.27 + inv.selector = action;
1.28 + return inv;
1.29 +}
1.30 +
1.31 +
1.32 +id $calltarget( NSInvocation *target, id param )
1.33 +{
1.34 + if( target && target.target ) {
1.35 + [target setArgument: ¶m atIndex: 2];
1.36 + [target invoke];
1.37 +
1.38 + NSMethodSignature *sig = target.methodSignature;
1.39 + NSUInteger returnLength = sig.methodReturnLength;
1.40 + if( returnLength==0 )
1.41 + return nil; // void
1.42 + else {
1.43 + const char *returnType = sig.methodReturnType;
1.44 + if( returnType[0]=='@' ) {
1.45 + id returnObject;
1.46 + [target getReturnValue: &returnObject];
1.47 + return returnObject;
1.48 + } else {
1.49 + UInt8 returnBuffer[returnLength];
1.50 + [target getReturnValue: &returnBuffer];
1.51 + return [NSValue valueWithBytes: &returnBuffer objCType: returnType];
1.52 + }
1.53 + }
1.54 + } else
1.55 + return nil;
1.56 +}