diff --git a/ChangeLog b/ChangeLog index d96268b0a..3d27007eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-04-25 Richard Frith-Macdonald + + * Source/NSProtocolChecker.m: Rewrite ... appeared almost totally + non-functional. + 2004-04-23 David Ayers * Source/Additions/GSLock.m ([GSLazyLock -init]) diff --git a/Headers/Foundation/NSProtocolChecker.h b/Headers/Foundation/NSProtocolChecker.h index cecf13e31..cc1a9e9ea 100644 --- a/Headers/Foundation/NSProtocolChecker.h +++ b/Headers/Foundation/NSProtocolChecker.h @@ -36,18 +36,19 @@ // Creating a checker -+ (id) protocolCheckerWithTarget: (NSObject *)anObject - protocol: (Protocol *)aProtocol; -- (id) initWithTarget: (NSObject *)anObject protocol: (Protocol *)aProtocol; ++ (id) protocolCheckerWithTarget: (NSObject*)anObject + protocol: (Protocol*)aProtocol; + +- (id) initWithTarget: (NSObject*)anObject + protocol: (Protocol*)aProtocol; // Reimplemented NSObject methods -- (void)forwardInvocation: (NSInvocation *)anInvocation; -- (struct objc_method_description *) methodDescriptionForSelector: (SEL)aSelector; +- (void) forwardInvocation: (NSInvocation*)anInvocation; // Getting information -- (Protocol *) protocol; -- (NSObject *) target; +- (Protocol*) protocol; +- (NSObject*) target; @end diff --git a/Source/NSFileManager.m b/Source/NSFileManager.m index 7f373d858..0cd0517fb 100644 --- a/Source/NSFileManager.m +++ b/Source/NSFileManager.m @@ -564,7 +564,7 @@ static NSFileManager* defaultManager = nil; #endif /* This is consitent with MacOSX - just return NO for an invalid path. */ - if (path == nil) + if ([path length] == 0) return NO; #if defined(__MINGW__) @@ -719,7 +719,7 @@ static NSFileManager* defaultManager = nil; #endif /* This is consitent with MacOSX - just return NO for an invalid path. */ - if (path == nil) + if ([path length] == 0) return NO; #if defined(__MINGW__) diff --git a/Source/NSProtocolChecker.m b/Source/NSProtocolChecker.m index 45563c7ff..7f6177353 100644 --- a/Source/NSProtocolChecker.m +++ b/Source/NSProtocolChecker.m @@ -3,26 +3,28 @@ Written by: Mike Kienenberger Date: Jun 1998 - + Rewrite: Richard Frith-Macdonald + Date: April 2004 + This file is part of the GNUstep Base Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. NSProtocolChecker class reference $Date$ $Revision$ - */ + */ #include "config.h" #include "GNUstepBase/preface.h" @@ -33,14 +35,13 @@ @implementation NSProtocolChecker -/* +/** * Allocates and initializes an NSProtocolChecker instance that will * forward any messages in the aProtocol protocol to anObject, its * target. Thus, the checker can be vended in lieu of anObject to * restrict the messages that can be sent to anObject. Returns the * new instance. */ - + (id) protocolCheckerWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol { @@ -48,51 +49,42 @@ protocol: aProtocol]); } +- (void) dealloc +{ + DESTROY(_myTarget); + [super dealloc]; +} + /* * Forwards any message to the delegate if the method is declared in * the checker's protocol; otherwise raises an NSInvalidArgumentException. */ - (void) forwardInvocation: (NSInvocation*)anInvocation { - unsigned int length; - void *buffer; - - if ((struct objc_method_description *)NULL - != [self methodDescriptionForSelector: [anInvocation selector]]) - [[NSException exceptionWithName: NSInvalidArgumentException - reason: @"Method not declared in current protocol" - userInfo: nil] raise]; - - [anInvocation invokeWithTarget: _myTarget]; - - length = [[anInvocation methodSignature] methodReturnLength]; - buffer = (void *)malloc(length); - [anInvocation getReturnValue: buffer]; - - if (0 == strcmp([[anInvocation methodSignature] methodReturnType], - [[anInvocation methodSignatureForSelector: - @selector(init: )] methodReturnType]) ) + if (GSObjCIsInstance(_myTarget) + && ![_myProtocol descriptionForInstanceMethod: [anInvocation selector]]) { - if (((id)buffer) == _myTarget) - { - buffer = self; - [anInvocation setReturnValue: buffer]; - } + [NSException raise: NSInvalidArgumentException + format: @"<%s -%@> not declared", + [_myProtocol name], NSStringFromSelector([anInvocation selector])]; + } + else if (![_myProtocol descriptionForClassMethod: [anInvocation selector]]) + { + [NSException raise: NSInvalidArgumentException + format: @"<%s +%@> not declared", + [_myProtocol name], NSStringFromSelector([anInvocation selector])]; } - - return; -} + [anInvocation invokeWithTarget: _myTarget]; +} - (id) init { - _myProtocol = nil; - _myTarget = nil; - + self = [self initWithTarget: nil protocol: nil]; return self; } -/* +/** * Initializes a newly allocated NSProtocolChecker instance that will * forward any messages in the aProtocol protocol to anObject, its * delegate. Thus, the checker can be vended in lieu of anObject to @@ -102,41 +94,25 @@ */ - (id) initWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol { - [super init]; - - _myProtocol = aProtocol; - - ASSIGN(_myTarget, anObject); - + self = [super init]; + if (self != nil) + { + _myProtocol = aProtocol; + ASSIGN(_myTarget, anObject); + } return self; } -/* - * Returns an Objective C description for a method in the checker's - * protocol, or NULL if aSelector isn't declared as an instance method - * in the protocol. - */ -- (struct objc_method_description*) methodDescriptionForSelector: (SEL)aSelector -{ - return [_myProtocol descriptionForInstanceMethod: aSelector]; -} - -/* +/** * Returns the protocol object the checker uses to verify whether a - * given message should be forwarded to its delegate, or the protocol - * checker should raise an NSInvalidArgumentException. + * given message should be forwarded to its delegate. */ - (Protocol*) protocol { - if (nil == _myProtocol) - [[NSException exceptionWithName: NSInvalidArgumentException - reason: @"No protocol specified" - userInfo: nil] raise]; - return _myProtocol; } -/* +/** * Returns the target of the NSProtocolChecker. */ - (NSObject*) target