mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 00:30:53 +00:00
Archiving fix.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@12623 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
e030a18e39
commit
2ffd921a4c
2 changed files with 51 additions and 17 deletions
|
@ -366,7 +366,7 @@ static NSLock *placeholderLock;
|
|||
- (void) encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
unsigned size;
|
||||
char *data;
|
||||
const char *data;
|
||||
const char *objctype = [self objCType];
|
||||
NSMutableData *d;
|
||||
|
||||
|
@ -378,10 +378,15 @@ static NSLock *placeholderLock;
|
|||
[self getValue: (void*)data];
|
||||
d = [NSMutableData new];
|
||||
[d serializeDataAt: data ofObjCType: objctype context: nil];
|
||||
[coder encodeValueOfObjCType: @encode(id) at: &d];
|
||||
size = [d length];
|
||||
[coder encodeValueOfObjCType: @encode(unsigned) at: &size];
|
||||
NSZoneFree(NSDefaultMallocZone(), (void*)data);
|
||||
data = [d bytes];
|
||||
[coder encodeArrayOfObjCType: @encode(unsigned char) count: size at: data];
|
||||
RELEASE(d);
|
||||
NSZoneFree(NSDefaultMallocZone(), data);
|
||||
}
|
||||
|
||||
@class NSDataStatic; // Neede for decoding.
|
||||
|
||||
- (id) initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
|
@ -458,9 +463,13 @@ static NSLock *placeholderLock;
|
|||
}
|
||||
else
|
||||
{
|
||||
NSData *d;
|
||||
static NSData *d = nil;
|
||||
unsigned cursor = 0;
|
||||
|
||||
if (d == nil)
|
||||
{
|
||||
d = [NSDataStatic allocWithZone: NSDefaultMallocZone()];
|
||||
}
|
||||
/*
|
||||
* For performance, decode small values directly onto the stack,
|
||||
* For larger values we allocate and deallocate heap space.
|
||||
|
@ -470,26 +479,42 @@ static NSLock *placeholderLock;
|
|||
{
|
||||
unsigned char data[size];
|
||||
|
||||
[coder decodeValueOfObjCType: @encode(id) at: &d];
|
||||
[d deserializeDataAt: data
|
||||
ofObjCType: objctype
|
||||
atCursor: &cursor
|
||||
context: nil];
|
||||
[coder decodeValueOfObjCType: @encode(unsigned) at: &size];
|
||||
{
|
||||
unsigned char serialized[size];
|
||||
|
||||
[coder decodeArrayOfObjCType: @encode(unsigned char)
|
||||
count: size
|
||||
at: (void*)serialized];
|
||||
d = [d initWithBytesNoCopy: (void*)serialized length: size];
|
||||
[d deserializeDataAt: data
|
||||
ofObjCType: objctype
|
||||
atCursor: &cursor
|
||||
context: nil];
|
||||
}
|
||||
o = [o initWithBytes: data objCType: objctype];
|
||||
RELEASE(d);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned char *data;
|
||||
void *data;
|
||||
|
||||
data = (void *)NSZoneMalloc(NSDefaultMallocZone(), size);
|
||||
[coder decodeValueOfObjCType: @encode(id) at: &d];
|
||||
[d deserializeDataAt: data
|
||||
ofObjCType: objctype
|
||||
atCursor: &cursor
|
||||
context: nil];
|
||||
[coder decodeValueOfObjCType: @encode(unsigned) at: &size];
|
||||
{
|
||||
void *serialized;
|
||||
|
||||
serialized = (void *)NSZoneMalloc(NSDefaultMallocZone(), size);
|
||||
[coder decodeArrayOfObjCType: @encode(unsigned char)
|
||||
count: size
|
||||
at: serialized];
|
||||
d = [d initWithBytesNoCopy: serialized length: size];
|
||||
[d deserializeDataAt: data
|
||||
ofObjCType: objctype
|
||||
atCursor: &cursor
|
||||
context: nil];
|
||||
NSZoneFree(NSDefaultMallocZone(), serialized);
|
||||
}
|
||||
o = [o initWithBytes: data objCType: objctype];
|
||||
RELEASE(d);
|
||||
NSZoneFree(NSDefaultMallocZone(), data);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue