mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
(return_retained): New macro.
([Invocation -setReturnValue:]): Retain return value if necessary. ([ArgframeInvocation -_retainArguments]): Add missing local var. ([MethodInvocation -initWithArgframe:type:]): New method. ([MethodInvocation -initWithArgframe:selector:]): Use new method. Set selector using sel_pointer. ([ObjectFunctionInvocation -invokeWithObject:]): Use return_retained, not args_retained. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@999 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
645c3c3c96
commit
d4cdc0c31f
1 changed files with 23 additions and 4 deletions
|
@ -44,6 +44,8 @@
|
|||
/* memory.h and strings.h conflict on some systems. */
|
||||
#endif /* not STDC_HEADERS and not HAVE_STRING_H */
|
||||
|
||||
/* xxx Perhaps make this an ivar. */
|
||||
#define return_retained 1
|
||||
|
||||
@implementation Invocation
|
||||
|
||||
|
@ -142,8 +144,16 @@
|
|||
- (void) setReturnValue: (void*)addr
|
||||
{
|
||||
if (return_value)
|
||||
memcpy (return_value, addr, return_size);
|
||||
/* xxx retain, if necessary. */
|
||||
{
|
||||
if (return_retained && *return_type == _C_ID)
|
||||
{
|
||||
[*(id*)return_value release];
|
||||
*(id*)return_value = *(id*)addr;
|
||||
[*(id*)return_value retain];
|
||||
}
|
||||
else
|
||||
memcpy (return_value, addr, return_size);
|
||||
}
|
||||
}
|
||||
|
||||
- objectReturnValue
|
||||
|
@ -284,6 +294,7 @@ my_method_get_next_argument (arglist_t argframe,
|
|||
- (void) _retainArguments
|
||||
{
|
||||
const char *tmptype;
|
||||
void *datum;
|
||||
|
||||
tmptype = return_type;
|
||||
while ((datum = my_method_get_next_argument (argframe, &tmptype)))
|
||||
|
@ -470,6 +481,13 @@ my_method_get_next_argument (arglist_t argframe,
|
|||
}
|
||||
|
||||
/* This is the designated initializer */
|
||||
- initWithArgframe: (arglist_t)frame type: (const char*)t
|
||||
{
|
||||
[super initWithArgframe: frame type: t];
|
||||
[self _initTargetAndSelPointers];
|
||||
return self;
|
||||
}
|
||||
|
||||
- initWithArgframe: (arglist_t)frame selector: (SEL)sel
|
||||
{
|
||||
const char *sel_type;
|
||||
|
@ -477,7 +495,8 @@ my_method_get_next_argument (arglist_t argframe,
|
|||
if (! (sel_type = sel_get_type (sel)) )
|
||||
sel_type = sel_get_type ( sel_get_any_typed_uid (sel_get_name (sel)));
|
||||
[self initWithArgframe: frame type: sel_type];
|
||||
[self _initTargetAndSelPointers];
|
||||
if (!frame)
|
||||
*sel_pointer = sel;
|
||||
return self;
|
||||
}
|
||||
|
||||
|
@ -772,7 +791,7 @@ my_method_get_next_argument (arglist_t argframe,
|
|||
r = (*function) (anObject);
|
||||
if (*(id*)return_value != r)
|
||||
{
|
||||
if (args_retained)
|
||||
if (return_retained)
|
||||
{
|
||||
[*(id*)return_value release];
|
||||
[r retain];
|
||||
|
|
Loading…
Reference in a new issue