From df6384cc1854748eb2a923aba796d9e00633bb34 Mon Sep 17 00:00:00 2001 From: rfm Date: Mon, 1 Mar 2010 10:34:35 +0000 Subject: [PATCH] avoid objc_skip_offset() git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@29814 72102866-910b-0410-8b05-ffd578937521 --- Source/Additions/GSObjCRuntime.m | 2 +- Source/GSFFCallInvocation.m | 6 +++--- Source/GSFFIInvocation.m | 6 +++--- Source/NSObjCRuntime.m | 28 ++++++++++++++++++++++------ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Source/Additions/GSObjCRuntime.m b/Source/Additions/GSObjCRuntime.m index 06adf8a8c..f36e81eef 100644 --- a/Source/Additions/GSObjCRuntime.m +++ b/Source/Additions/GSObjCRuntime.m @@ -231,7 +231,7 @@ GSObjCFindVariable(id obj, const char *name, NSUInteger s; NSUInteger a; - NSGetSizeAndAlignment(enc,&s, &a); + NSGetSizeAndAlignment(enc, &s, &a); *size = s; } if (offset != 0) diff --git a/Source/GSFFCallInvocation.m b/Source/GSFFCallInvocation.m index 14f0c2683..4984388c1 100644 --- a/Source/GSFFCallInvocation.m +++ b/Source/GSFFCallInvocation.m @@ -804,13 +804,13 @@ gs_protocol_selector(const char *types) } while (*types != '\0') { - if (*types == '-') + if (*types == '+' || *types == '-') { types++; } - if (*types == '+' || isdigit(*types)) + while(isdigit(*types)) { - types = objc_skip_offset(types); + types++; } while (*types == _C_CONST || *types == _C_GCINVISIBLE) { diff --git a/Source/GSFFIInvocation.m b/Source/GSFFIInvocation.m index cdfe951c4..675418cdd 100644 --- a/Source/GSFFIInvocation.m +++ b/Source/GSFFIInvocation.m @@ -496,13 +496,13 @@ gs_protocol_selector(const char *types) } while (*types != '\0') { - if (*types == '-') + if (*types == '+' || *types == '-') { types++; } - if (*types == '+' || isdigit(*types)) + while(isdigit(*types)) { - types = objc_skip_offset(types); + types++; } while (*types == _C_CONST || *types == _C_GCINVISIBLE) { diff --git a/Source/NSObjCRuntime.m b/Source/NSObjCRuntime.m index 413331f7a..426bb8785 100644 --- a/Source/NSObjCRuntime.m +++ b/Source/NSObjCRuntime.m @@ -137,12 +137,28 @@ const char * NSGetSizeAndAlignment(const char *typePtr, NSUInteger *sizep, NSUInteger *alignp) { - typePtr = objc_skip_offset (typePtr); - typePtr = objc_skip_type_qualifiers (typePtr); - if (sizep) - *sizep = objc_sizeof_type (typePtr); - if (alignp) - *alignp = objc_alignof_type (typePtr); + if (typePtr != NULL) + { + /* Skip any offset, but don't call objc_skip_offset() as that's buggy. + */ + if (*typePtr == '+' || *typePtr == '-') + { + typePtr++; + } + while (isdigit(*typePtr)) + { + typePtr++; + } + typePtr = objc_skip_type_qualifiers (typePtr); + if (sizep) + { + *sizep = objc_sizeof_type (typePtr); + } + if (alignp) + { + *alignp = objc_alignof_type (typePtr); + } + } return typePtr; }