diff --git a/Source/GSFFCallInvocation.m b/Source/GSFFCallInvocation.m index fee9709a1..c4fbae51a 100644 --- a/Source/GSFFCallInvocation.m +++ b/Source/GSFFCallInvocation.m @@ -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; } diff --git a/Source/NSArchiver.m b/Source/NSArchiver.m index b13ad14a6..711287b04 100644 --- a/Source/NSArchiver.m +++ b/Source/NSArchiver.m @@ -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 "=" */ - - 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; diff --git a/Source/NSData.m b/Source/NSData.m index 3676799a9..5a19b8e5f 100644 --- a/Source/NSData.m +++ b/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 "=" */ - 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 "=" */ - 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 "=" */ - 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 "=" */ - 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; } diff --git a/Source/NSUnarchiver.m b/Source/NSUnarchiver.m index 0e43fc72d..c66b7aa09 100644 --- a/Source/NSUnarchiver.m +++ b/Source/NSUnarchiver.m @@ -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 "=" */ - 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; }