Changeset 332

Show
Ignore:
Timestamp:
09/27/08 16:03:09 (3 months ago)
Author:
wolf
Message:

[FIX] NSXReturnThrowError: when using NSXReturnError() on a Cocoa method that returns both a result BOOL and an NSError**, the BOOL was checked+used unconditionally, masking the originating NSError**, even if set. The NSError** probably has greater fidelity since it originates deeper down the call chain, so now we respect it if set. The upside to this is that NSXReturnError() will never set error itself if you call it with error being non-nil. But that's a weird use-case in my book.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cocoa/NSXReturnThrowError/NSXReturnThrowError.h

    r328 r332  
    8585        do{     \ 
    8686                typeof(CODE) codeResult = (CODE);       \ 
    87                 NSXMakeErrorImp(@encode(typeof(CODE)), (intptr_t)codeResult, __FILE__, __LINE__, __PRETTY_FUNCTION__, #CODE, &ERROR);   \ 
     87        if (!ERROR) {   \ 
     88            NSXMakeErrorImp(@encode(typeof(CODE)), (intptr_t)codeResult, __FILE__, __LINE__, __PRETTY_FUNCTION__, #CODE, &ERROR);       \ 
     89        }   \ 
    8890        }while(0) 
    8991 
  • trunk/cocoa/NSXReturnThrowError/TestNSXReturnThrowError.m

    r213 r332  
    1313static int* returnGoodIntPtr(){ static int dummy = 42; return &dummy; } 
    1414static BOOL returnGoodBool(){ return YES; } 
     15static BOOL returnGoodBoolAndNoError(NSError **error) { return YES; } 
    1516 
    1617static OSErr returnOSErr() { return qErr; } 
     
    2223static int* returnBadIntPtr(){ return NULL; } 
    2324static BOOL returnBadBool(){ return NO; } 
     25static BOOL returnBadBoolAndError(NSError **error) { assert(error); *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:paramErr userInfo:nil]; return NO; } 
    2426 
    2527//-- 
     
    5658        NSXReturnError(returnGoodBool()); 
    5759                assert(!error); 
     60        NSXReturnError(returnGoodBoolAndNoError(&error)); 
     61                assert(!error); 
    5862         
    5963        //-- 
     
    99103                assert([error code] == -1); 
    100104                error = nil; 
     105        NSXReturnError(returnBadBoolAndError(&error)); 
     106        assert(error); 
     107        assert([[error domain] isEqualToString:NSOSStatusErrorDomain]); 
     108        assert([error code] == paramErr); 
     109        error = nil; 
    101110         
    102111        //-- 
     
    196205                assert([[error domain] isEqualToString:BOOLErrorDomain]); 
    197206                assert([error code] == -1); 
     207                error = nil; 
     208         
     209        NS_DURING 
     210                NSXThrowError(returnBadBoolAndError(&error)); 
     211                assert(0); 
     212        NS_HANDLER 
     213                assert([[localException name] isEqualToString:@"NSXError"]); 
     214                error = [[localException userInfo] objectForKey:@"error"]; 
     215        NS_ENDHANDLER 
     216                assert(error); 
     217                assert([[error domain] isEqualToString:NSOSStatusErrorDomain]); 
     218                assert([error code] == paramErr); 
    198219                error = nil; 
    199220         
  • trunk/cocoa/NSXReturnThrowError/TestNSXReturnThrowError.xcodeproj/project.pbxproj

    r188 r332  
    1616                08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; 
    1717                32A70AAB03705E1F00C91783 /* TestNSXReturnThrowError_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestNSXReturnThrowError_Prefix.pch; sourceTree = "<group>"; }; 
    18                 79874C510B50BA6300AEDF1A /* NSXReturnThrowError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXReturnThrowError.h; sourceTree = "<group>"; }; 
     18                792530BA0E8F340D00DFAD98 /* NSXReturnThrowError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXReturnThrowError.h; sourceTree = "<group>"; }; 
    1919                8DD76FA10486AA7600D96B5E /* TestNSXReturnThrowError */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = TestNSXReturnThrowError; sourceTree = BUILT_PRODUCTS_DIR; }; 
    2020/* End PBXFileReference section */ 
     
    4646                        children = ( 
    4747                                08FB7796FE84155DC02AAC07 /* TestNSXReturnThrowError.m */, 
    48                                 79874C510B50BA6300AEDF1A /* NSXReturnThrowError.h */, 
     48                                792530BA0E8F340D00DFAD98 /* NSXReturnThrowError.h */, 
    4949                                32A70AAB03705E1F00C91783 /* TestNSXReturnThrowError_Prefix.pch */, 
    5050                        ); 
     
    9494                        isa = PBXProject; 
    9595                        buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "TestNSXReturnThrowError" */; 
     96                        compatibilityVersion = "Xcode 2.4"; 
    9697                        hasScannedForEncodings = 1; 
    9798                        mainGroup = 08FB7794FE84155DC02AAC07 /* TestNSXReturnThrowError */; 
    9899                        projectDirPath = ""; 
     100                        projectRoot = ""; 
    99101                        targets = ( 
    100102                                8DD76F960486AA7600D96B5E /* TestNSXReturnThrowError */,