attempt fix for bug #30040

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@30625 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2010-06-08 19:05:04 +00:00
parent 77aefa83e5
commit a1d26aa790
2 changed files with 56 additions and 17 deletions

View file

@ -1,3 +1,9 @@
2010-06-08 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSPropertyList.m: When encoding OSX binary property list,
try to differentiate between integer and float items which have the
same numeric value (bug #30040).
2010-06-08 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSURL.m:

View file

@ -443,7 +443,7 @@ foundIgnorableWhitespace: (NSString *)string
@interface BinaryPLGenerator : NSObject
{
NSMutableData *dest;
NSMutableArray *objectList;
NSMapTable *objectList;
NSMutableArray *objectsToDoList;
id root;
@ -3231,6 +3231,28 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
@end
/* Test two items for equality ... boith are objects.
* If either is an NSNumber, we insist that they are the same class
* so that numbers with the same numeric value but different classes
* are not treated as the same number (that confuses OSXs decoding).
*/
static BOOL
isEqualFunc(const void *item1, const void *item2,
NSUInteger (*size)(const void *item))
{
id o1 = (id)item1;
id o2 = (id)item2;
if ([o1 isKindOfClass: [NSNumber class]]
|| [o2 isKindOfClass: [NSNumber class]])
{
if ([o1 class] != [o2 class])
{
return NO;
}
}
return [o1 isEqual: o2];
}
@implementation BinaryPLGenerator
@ -3270,6 +3292,9 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
- (void) setup
{
NSPointerFunctions *k;
NSPointerFunctions *v;
[dest setLength: 0];
if (index_size == 1)
{
@ -3288,13 +3313,20 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
table_size = UINT_MAX;
}
table = objc_malloc(table_size * sizeof(int));
table = NSZoneMalloc(0, table_size * sizeof(int));
objectsToDoList = [[NSMutableArray alloc] init];
objectList = [[NSMutableArray alloc] init];
k = [NSPointerFunctions pointerFunctionsWithOptions:
NSPointerFunctionsObjectPersonality];
[k setIsEqualFunction: isEqualFunc];
v = [NSPointerFunctions pointerFunctionsWithOptions:
NSPointerFunctionsIntegerPersonality|NSPointerFunctionsOpaqueMemory];
objectList = [[NSMapTable alloc] initWithKeyPointerFunctions: k
valuePointerFunctions: v
capacity: 1000];
[objectsToDoList addObject: root];
[objectList addObject: root];
[objectList setObject: (id)1 forKey: root];
}
- (void) cleanup
@ -3303,7 +3335,7 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
DESTROY(objectList);
if (table != NULL)
{
objc_free(table);
NSZoneFree(0, table);
table = NULL;
}
}
@ -3325,14 +3357,15 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
- (void) markOffset: (unsigned int) offset for: (id)object
{
unsigned int oid;
int oid;
oid = [objectList indexOfObject: object];
if (oid == NSNotFound)
oid = (int)(NSInteger)[objectList objectForKey: object];
if (oid <= 0)
{
[NSException raise: NSGenericException
format: @"Unknown object %@.", object];
}
oid--;
if (oid >= table_size)
{
[NSException raise: NSRangeException
@ -3380,7 +3413,7 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
len = [objectList count];
size = offset_size * len;
buffer = objc_malloc(size);
buffer = NSZoneMalloc(0, size);
if (offset_size == 1)
{
@ -3430,7 +3463,7 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
}
[dest appendBytes: buffer length: size];
objc_free(buffer);
NSZoneFree(0, buffer);
}
- (void) writeMetaData
@ -3463,17 +3496,17 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
- (unsigned int) indexForObject: (id)object
{
unsigned int index;
int index;
index = [objectList indexOfObject: object];
if (index == NSNotFound)
index = (int)[objectList objectForKey: object];
if (index <= 0)
{
index = [objectList count];
[objectList addObject: object];
[objectList setObject: (id)(++index) forKey: object];
[objectsToDoList addObject: object];
}
return index;
return index - 1;
}
- (void) storeIndex: (unsigned int)index
@ -3618,7 +3651,7 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
code = 0x6F;
[dest appendBytes: &code length: 1];
buffer = objc_malloc(sizeof(unichar)*(len + 1));
buffer = NSZoneMalloc(0, sizeof(unichar)*(len + 1));
[self storeCount: len];
[string getCharacters: buffer];
for (i = 0; i < len; i++)
@ -3626,7 +3659,7 @@ GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml,
buffer[i] = NSSwapHostShortToBig(buffer[i]);
}
[dest appendBytes: buffer length: sizeof(unichar)*len];
objc_free(buffer);
NSZoneFree(0, buffer);
}
}
}