diff --git a/Source/mframe/unknown/generic b/Source/mframe/unknown/generic index 1a752dce0..78ba9620f 100644 --- a/Source/mframe/unknown/generic +++ b/Source/mframe/unknown/generic @@ -19,11 +19,15 @@ #define MFRAME_ARGS int +/* #define MFRAME_INIT_ARGS(CUM, RTYPE) \ ((CUM) = ((*(RTYPE)==_C_STRUCT_B || *(RTYPE)==_C_UNION_B || \ *(RTYPE)==_C_ARY_B) && \ objc_sizeof_type(RTYPE) > MFRAME_SMALL_STRUCT) \ ? sizeof(void*) : 0) +*/ + +#define MFRAME_INIT_ARGS(CUM, RTYPE) ((CUM) = 0) #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \ ({ \ @@ -31,30 +35,28 @@ int align = objc_alignof_type(type); \ int size = objc_sizeof_type(type); \ \ - (CUM) = ROUND((CUM), align); \ (TYPE) = objc_skip_typespec(type); \ - sprintf((DEST), "%.*s%d", (int)((TYPE)-type), type, (CUM)); \ - if (*(TYPE) == '+') \ - { \ - (TYPE)++; \ - } \ - if (*(TYPE) == '-') \ - { \ - (TYPE)++; \ - } \ + (CUM) = ROUND((CUM), __alignof__(int)); \ + sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM)); \ + if (*(TYPE) == '+') (TYPE)++; \ + if (*(TYPE) == '-') (TYPE)++; \ while (isdigit(*(TYPE))) \ { \ (TYPE)++; \ } \ (DEST)=&(DEST)[strlen(DEST)]; \ - if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) \ + if ((*type==_C_STRUCT_B||*type==_C_UNION_B||*type==_C_ARY_B)) \ { \ (STACK) = (CUM) + ROUND(size, align); \ } \ else \ { \ + if (size < sizeof(int)) \ + { \ + size = sizeof(int); \ + } \ (STACK) = (CUM) + size; \ } \ - (CUM) += ROUND(size, sizeof(void*)); \ + (CUM) += size; \ })