mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 09:41:15 +00:00
Added documentation
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@16352 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
abaae090cb
commit
df144d00c8
3 changed files with 126 additions and 15 deletions
|
@ -1,7 +1,7 @@
|
||||||
2003-04-04 Richard Frith-Macdonald <rfm@gnu.org>
|
2003-04-04 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Headers/Foundation/NSInvocation: Added NS_INVOCATION asnd NS_MESSAGE
|
* Headers/Foundation/NSInvocation: Added NS_INVOCATION asnd NS_MESSAGE
|
||||||
* Source/NSInvocation.m: Support the two new macros.
|
* Source/NSInvocation.m: Support the two new macros. Documented.
|
||||||
* Testing/nsinvocation.m: Trivial tests added.
|
* Testing/nsinvocation.m: Trivial tests added.
|
||||||
* Documentation/OpenStepCompliance.gsdoc: Updated.
|
* Documentation/OpenStepCompliance.gsdoc: Updated.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* Interface for NSInvocation for GNUStep
|
/* Interface for NSInvocation for GNUStep
|
||||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
Copyright (C) 1998,2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written: Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
Author: Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
Date: 1998
|
Date: 1998
|
||||||
Based on code by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
Based on code by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
@ -103,12 +103,25 @@
|
||||||
+ (NSInvocation*) _returnInvocationAndDestroyProxy: (id)proxy;
|
+ (NSInvocation*) _returnInvocationAndDestroyProxy: (id)proxy;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns an autoreleased invocation containing a
|
||||||
|
* message to an instance of the class. The 'message' consists
|
||||||
|
* of selector and arguments like a standard ObjectiveC method
|
||||||
|
* call.<br />
|
||||||
|
* Before using the returned invocation, you need to set its target.
|
||||||
|
*/
|
||||||
#define NS_INVOCATION(class, message...) ({\
|
#define NS_INVOCATION(class, message...) ({\
|
||||||
id __proxy = [NSInvocation _newProxyForInvocation: class]; \
|
id __proxy = [NSInvocation _newProxyForInvocation: class]; \
|
||||||
[__proxy message]; \
|
[__proxy message]; \
|
||||||
[NSInvocation _returnInvocationAndDestroyProxy: __proxy]; \
|
[NSInvocation _returnInvocationAndDestroyProxy: __proxy]; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and returns an autoreleased invocation containing a
|
||||||
|
* message to the target object. The 'message' consists
|
||||||
|
* of selector and arguments like a standard ObjectiveC method
|
||||||
|
* call.
|
||||||
|
*/
|
||||||
#define NS_MESSAGE(target, message...) ({\
|
#define NS_MESSAGE(target, message...) ({\
|
||||||
id __proxy = [NSInvocation _newProxyForMessage: target]; \
|
id __proxy = [NSInvocation _newProxyForMessage: target]; \
|
||||||
[__proxy message]; \
|
[__proxy message]; \
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** Implementation of NSInvocation for GNUStep
|
/** Implementation of NSInvocation for GNUStep
|
||||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
Copyright (C) 1998,2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written: Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
Author: Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||||
Date: August 1998
|
Date: August 1998
|
||||||
Based on code by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
Based on code by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
@ -54,6 +54,33 @@ static Class NSInvocation_concrete_class;
|
||||||
@interface GSMessageProxy : GSInvocationProxy
|
@interface GSMessageProxy : GSInvocationProxy
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>The NSInvocation class implements a mechanism of constructing
|
||||||
|
* messages (as NSInvocation instances), sending these to other
|
||||||
|
* objects, and handling the returned values.
|
||||||
|
* </p>
|
||||||
|
* <p>An NSInvocation object may contain a target object to which a
|
||||||
|
* message can be sent, or may send the message to an arbitrary object.<br />
|
||||||
|
* Each message consists of a selector for that method and an argument
|
||||||
|
* list. Once the message has been sent, the invocation will contain
|
||||||
|
* a return value whose contents may be copied out of it.
|
||||||
|
* </p>
|
||||||
|
* <p>The target, selector, and arguments of an instance be constructed
|
||||||
|
* dynamically, providing a great deal of power/flexibility.
|
||||||
|
* </p>
|
||||||
|
* <p>The sending of the message to the target object (using the -invoke
|
||||||
|
* or -invokeWithTarget: method) can be done at any time, but a standard
|
||||||
|
* use of this is by the [NSObject-forwardInvocation:] method which is
|
||||||
|
* called whenever a method is not implemented by the class of the
|
||||||
|
* object to which it was sent.
|
||||||
|
* </p>
|
||||||
|
* <p>Related to the class are two convenience macros ... NS_MESSAGE()
|
||||||
|
* and NS_INVOCATION() to allow easy construction of invocations with
|
||||||
|
* all the arguments set up.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
@implementation NSInvocation
|
@implementation NSInvocation
|
||||||
|
|
||||||
#ifdef USE_LIBFFI
|
#ifdef USE_LIBFFI
|
||||||
|
@ -244,6 +271,11 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies the invocations return value to the location pointed to by buffer
|
||||||
|
* if a return value has been set (see the -setReturnValue: method).<br />
|
||||||
|
* If there isn't a return value then this method raises an exception.
|
||||||
|
*/
|
||||||
- (void) getReturnValue: (void*)buffer
|
- (void) getReturnValue: (void*)buffer
|
||||||
{
|
{
|
||||||
const char *type;
|
const char *type;
|
||||||
|
@ -267,11 +299,23 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selector of the invocation (the argument at index 1)
|
||||||
|
*/
|
||||||
- (SEL) selector
|
- (SEL) selector
|
||||||
{
|
{
|
||||||
return _selector;
|
return _selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the argument identified by index from the memory location specified
|
||||||
|
* by the buffer argument.<br />
|
||||||
|
* Using an index of 0 is equivalent to calling -setTarget: and using an
|
||||||
|
* argument of 1 is equivalent to -setSelector:<br />
|
||||||
|
* Proper arguments start at index 2.<br />
|
||||||
|
* If -retainArguments was called, then any object argument set in the
|
||||||
|
* receiver is retained by it.
|
||||||
|
*/
|
||||||
- (void) setArgument: (void*)buffer
|
- (void) setArgument: (void*)buffer
|
||||||
atIndex: (int)index
|
atIndex: (int)index
|
||||||
{
|
{
|
||||||
|
@ -338,6 +382,9 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the return value of the invocation to the item that buffer points to.
|
||||||
|
*/
|
||||||
- (void) setReturnValue: (void*)buffer
|
- (void) setReturnValue: (void*)buffer
|
||||||
{
|
{
|
||||||
const char *type;
|
const char *type;
|
||||||
|
@ -361,11 +408,18 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
_validReturn = YES;
|
_validReturn = YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the selector for the invocation.
|
||||||
|
*/
|
||||||
- (void) setSelector: (SEL)aSelector
|
- (void) setSelector: (SEL)aSelector
|
||||||
{
|
{
|
||||||
_selector = aSelector;
|
_selector = aSelector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the target object for the invocation.<br />
|
||||||
|
* If -retainArguments was called, then the target is retained.
|
||||||
|
*/
|
||||||
- (void) setTarget: (id)anObject
|
- (void) setTarget: (id)anObject
|
||||||
{
|
{
|
||||||
if (_argsRetained)
|
if (_argsRetained)
|
||||||
|
@ -375,20 +429,27 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
_target = anObject;
|
_target = anObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the target object of the invocation.
|
||||||
|
*/
|
||||||
- (id) target
|
- (id) target
|
||||||
{
|
{
|
||||||
return _target;
|
return _target;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Managing arguments.
|
* Returns a flag to indicate whether object arguments of the invocation
|
||||||
|
* (including its target) are retained by the invocation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
- (BOOL) argumentsRetained
|
- (BOOL) argumentsRetained
|
||||||
{
|
{
|
||||||
return _argsRetained;
|
return _argsRetained;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instructs the invocation to retain its object arguments (including the
|
||||||
|
* target). The default is not to retain them.
|
||||||
|
*/
|
||||||
- (void) retainArguments
|
- (void) retainArguments
|
||||||
{
|
{
|
||||||
if (_argsRetained)
|
if (_argsRetained)
|
||||||
|
@ -438,15 +499,17 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Dispatching an Invocation.
|
* Sends the message encapsulated in the invocation to its target.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
- (void) invoke
|
- (void) invoke
|
||||||
{
|
{
|
||||||
[self invokeWithTarget: _target];
|
[self invokeWithTarget: _target];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends the message encapsulated in the invocation to anObject.
|
||||||
|
*/
|
||||||
- (void) invokeWithTarget: (id)anObject
|
- (void) invokeWithTarget: (id)anObject
|
||||||
{
|
{
|
||||||
id old_target;
|
id old_target;
|
||||||
|
@ -524,10 +587,9 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
_validReturn = YES;
|
_validReturn = YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Getting the method _signature.
|
* Returns the method signature of the invocation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
- (NSMethodSignature*) methodSignature
|
- (NSMethodSignature*) methodSignature
|
||||||
{
|
{
|
||||||
return _sig;
|
return _sig;
|
||||||
|
@ -648,8 +710,19 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides some minor extensions and some utility methods to aid
|
||||||
|
* integration of NSInvocation with the ObjectiveC runtime.
|
||||||
|
*/
|
||||||
@implementation NSInvocation (GNUstep)
|
@implementation NSInvocation (GNUstep)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal use.<br />
|
||||||
|
* Initialises the receiver with a known selector and argument list
|
||||||
|
* as supplied to the forward:: method by the ObjectiveC runtime
|
||||||
|
* when it is unable to locate an implementation for mthe selector
|
||||||
|
* in a class.
|
||||||
|
*/
|
||||||
- (id) initWithArgframe: (arglist_t)frame selector: (SEL)aSelector
|
- (id) initWithArgframe: (arglist_t)frame selector: (SEL)aSelector
|
||||||
{
|
{
|
||||||
[self subclassResponsibility: _cmd];
|
[self subclassResponsibility: _cmd];
|
||||||
|
@ -694,6 +767,10 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
return [self initWithMethodSignature: newSig];
|
return [self initWithMethodSignature: newSig];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialises the reciever with the specified target, selector, and
|
||||||
|
* a variable number of arguments.
|
||||||
|
*/
|
||||||
- (id) initWithTarget: anObject selector: (SEL)aSelector, ...
|
- (id) initWithTarget: anObject selector: (SEL)aSelector, ...
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -797,23 +874,44 @@ _arg_addr(NSInvocation *inv, int index)
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal use.<br />
|
||||||
|
* Provides a return frame that the ObjectiveC runtime can use to
|
||||||
|
* return the result of an invocation to a calling function.
|
||||||
|
*/
|
||||||
- (void*) returnFrame: (arglist_t)argFrame
|
- (void*) returnFrame: (arglist_t)argFrame
|
||||||
{
|
{
|
||||||
[self subclassResponsibility: _cmd];
|
[self subclassResponsibility: _cmd];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the status of the flag set by -setSendsToSuper:
|
||||||
|
*/
|
||||||
- (BOOL) sendsToSuper
|
- (BOOL) sendsToSuper
|
||||||
{
|
{
|
||||||
return _sendToSuper;
|
return _sendToSuper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the flag to tell the invocation that it should actually invoke a
|
||||||
|
* method in the superclass of the target rather than the method of the
|
||||||
|
* target itsself.<br />
|
||||||
|
* This extension permits an invocation to act like a regular method
|
||||||
|
* call sent to <em>super</em> in the method of a class.
|
||||||
|
*/
|
||||||
- (void) setSendsToSuper: (BOOL)flag
|
- (void) setSendsToSuper: (BOOL)flag
|
||||||
{
|
{
|
||||||
_sendToSuper = flag;
|
_sendToSuper = flag;
|
||||||
}
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
/* These next three are for internal use only ... not public API */
|
/**
|
||||||
|
* These methods are for internal use only ... not public API<br />
|
||||||
|
* They are used by the NS_INVOCATION() and NS_MESSAGE() macros to help
|
||||||
|
* create invocations.
|
||||||
|
*/
|
||||||
|
@implementation NSInvocation (MacroSetup)
|
||||||
+ (id) _newProxyForInvocation: (id)target
|
+ (id) _newProxyForInvocation: (id)target
|
||||||
{
|
{
|
||||||
return [GSInvocationProxy _newWithTarget: target];
|
return [GSInvocationProxy _newWithTarget: target];
|
||||||
|
|
Loading…
Reference in a new issue