Fix memory leaks

This commit is contained in:
rfm 2024-12-19 19:18:18 +00:00
parent 546ca94ede
commit 5aa5692768

View file

@ -59,6 +59,7 @@
#import "Foundation/NSCharacterSet.h" #import "Foundation/NSCharacterSet.h"
#import "GNUstepBase/GSLocale.h" #import "GNUstepBase/GSLocale.h"
#import "GSPrivate.h"
@class NSDoubleNumber; @class NSDoubleNumber;
@ -1407,23 +1408,18 @@ static NSUInteger _defaultBehavior = NSNumberFormatterBehavior10_4;
- (NSNumber *) numberFromString: (NSString *)string - (NSNumber *) numberFromString: (NSString *)string
{ {
NSNumber *result = nil;
// This is a 10.4 and above method and should not work with earlier version. // This is a 10.4 and above method and should not work with earlier version.
#if GS_USE_ICU == 1 #if GS_USE_ICU == 1
NSNumber *result; NSUInteger length = [string length];
NSUInteger length;
if (length > 0)
{
NSRange range; NSRange range;
UErrorCode err = U_ZERO_ERROR; UErrorCode err = U_ZERO_ERROR;
unichar *ustring;
int64_t intNum; int64_t intNum;
double doubleNum; double doubleNum;
GS_BEGINITEMBUF(ustring, length * sizeof(unichar), unichar)
if (string == nil)
return nil;
length = [string length];
ustring = NSZoneMalloc ([self zone], sizeof(unichar) * length);
if (ustring == NULL)
return nil;
[string getCharacters: ustring range: NSMakeRange(0, length)]; [string getCharacters: ustring range: NSMakeRange(0, length)];
@ -1433,29 +1429,36 @@ static NSUInteger _defaultBehavior = NSNumberFormatterBehavior10_4;
{ {
intNum = unum_parseInt64(internal->_formatter, intNum = unum_parseInt64(internal->_formatter,
ustring, length, NULL, &err); ustring, length, NULL, &err);
if (U_FAILURE(err)) if (!U_FAILURE(err))
return nil; {
if (intNum == 0 || intNum == 1) if (intNum == 0 || intNum == 1)
{
result = [NSNumber numberWithBool: (BOOL) intNum]; result = [NSNumber numberWithBool: (BOOL) intNum];
}
else if (intNum < INT_MAX && intNum > INT_MIN) else if (intNum < INT_MAX && intNum > INT_MIN)
{
result = [NSNumber numberWithInt: (int32_t)intNum]; result = [NSNumber numberWithInt: (int32_t)intNum];
}
else else
{
result = [NSNumber numberWithLongLong: intNum]; result = [NSNumber numberWithLongLong: intNum];
} }
}
}
else else
{ {
doubleNum = unum_parseDouble(internal->_formatter, doubleNum = unum_parseDouble(internal->_formatter,
ustring, length, NULL, &err); ustring, length, NULL, &err);
if (U_FAILURE(err)) if (!U_FAILURE(err))
return nil; {
result = [NSNumber numberWithDouble: doubleNum]; result = [NSNumber numberWithDouble: doubleNum];
} }
}
NSZoneFree ([self zone], ustring); GS_ENDITEMBUF()
return result; }
#else
return nil;
#endif #endif
return result;
} }