Target.m
changeset 0 d84d25d6cdbb
child 1 e55a17cdabd2
     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: &param 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 +}