mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 09:04:13 +00:00
Encoding/decoding fixes
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@16417 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
e9b6860374
commit
edfa212583
4 changed files with 62 additions and 109 deletions
|
@ -426,7 +426,7 @@ static IMP gs_objc_msg_forward (SEL sel)
|
|||
|
||||
forwarding_callback
|
||||
= alloc_callback (&GSInvocationCallback, ret_info);
|
||||
|
||||
|
||||
GSIMapAddPairNoRetain (&ff_callback_map,
|
||||
(GSIMapKey) (void *) ret_info,
|
||||
(GSIMapVal) forwarding_callback);
|
||||
|
@ -450,7 +450,7 @@ static IMP gs_objc_msg_forward (SEL sel)
|
|||
&returnTypeInfo [index]);
|
||||
}
|
||||
|
||||
GSIMapInitWithZoneAndCapacity (&ff_callback_map, 0, 9);
|
||||
GSIMapInitWithZoneAndCapacity (&ff_callback_map, NSDefaultMallocZone(), 9);
|
||||
|
||||
__objc_msg_forward = gs_objc_msg_forward;
|
||||
}
|
||||
|
|
|
@ -292,34 +292,22 @@ static Class NSMutableDataMallocClass;
|
|||
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
if (_initialPass == NO)
|
||||
{
|
||||
(*_tagImp)(_dst, tagSel, _GSC_STRUCT_B);
|
||||
}
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
(*_eValImp)(self, eValSel, type, (char*)buf + offset);
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type == _C_STRUCT_E)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
int align = objc_alignof_type(type);
|
||||
int rem = offset % align;
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
offset += align - rem;
|
||||
}
|
||||
}
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
(*_eValImp)(self, eValSel, ftype, (char*)buf + offset);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
|
109
Source/NSData.m
109
Source/NSData.m
|
@ -1185,28 +1185,21 @@ failure:
|
|||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
[self deserializeDataAt: ((char*)data) + offset
|
||||
ofObjCType: type
|
||||
ofObjCType: ftype
|
||||
atCursor: cursor
|
||||
context: callback];
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type != _C_STRUCT_E)
|
||||
{
|
||||
int align = objc_alignof_type(type);
|
||||
int rem = offset % align;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
offset += align - rem;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1968,25 +1961,21 @@ failure:
|
|||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
int align, rem;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
[self serializeDataAt: ((char*)data) + offset
|
||||
ofObjCType: type
|
||||
ofObjCType: ftype
|
||||
context: callback];
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type != _C_STRUCT_E)
|
||||
{
|
||||
align = objc_alignof_type(type);
|
||||
if ((rem = offset % align))
|
||||
offset += align - rem;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
case _C_PTR:
|
||||
|
@ -2394,28 +2383,21 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
|||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
[self deserializeDataAt: ((char*)data) + offset
|
||||
ofObjCType: type
|
||||
ofObjCType: ftype
|
||||
atCursor: cursor
|
||||
context: callback];
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type != _C_STRUCT_E)
|
||||
{
|
||||
int align = objc_alignof_type(type);
|
||||
int rem = offset % align;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
offset += align - rem;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -3188,27 +3170,20 @@ getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos)
|
|||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
[self serializeDataAt: ((char*)data) + offset
|
||||
ofObjCType: type
|
||||
context: callback];
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type != _C_STRUCT_E)
|
||||
{
|
||||
unsigned align = objc_alignof_type(type);
|
||||
unsigned rem = offset % align;
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
offset += align - rem;
|
||||
}
|
||||
}
|
||||
else break;
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
[self serializeDataAt: ((char*)data) + offset
|
||||
ofObjCType: ftype
|
||||
context: callback];
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -746,29 +746,19 @@ static Class NSDataMallocClass;
|
|||
|
||||
case _GSC_STRUCT_B:
|
||||
{
|
||||
int offset = 0;
|
||||
struct objc_struct_layout layout;
|
||||
|
||||
typeCheck(*type, _GSC_STRUCT_B);
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
for (;;)
|
||||
objc_layout_structure (type, &layout);
|
||||
while (objc_layout_structure_next_member (&layout))
|
||||
{
|
||||
(*dValImp)(self, dValSel, type, (char*)address + offset);
|
||||
offset += objc_sizeof_type(type);
|
||||
type = objc_skip_typespec(type);
|
||||
if (*type == _C_STRUCT_E)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
int align = objc_alignof_type(type);
|
||||
int rem = offset % align;
|
||||
int offset;
|
||||
int align;
|
||||
const char *ftype;
|
||||
|
||||
if (rem != 0)
|
||||
{
|
||||
offset += align - rem;
|
||||
}
|
||||
}
|
||||
objc_layout_structure_get_info (&layout, &offset, &align, &ftype);
|
||||
|
||||
(*dValImp)(self, dValSel, ftype, (char*)address + offset);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue