/* See ../README for copyright */ #define MFRAME_STACK_STRUCT 1 #define MFRAME_STRUCT_BYREF 0 #define MFRAME_SMALL_STRUCT 0 #define MFRAME_ARGS_SIZE 8 #define MFRAME_RESULT_SIZE 116 #define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) \ ((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? \ *(void**)(ARGS)->arg_ptr : (void*)0) #define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) \ ({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) \ *(void**)(ARGS)->arg_ptr = (ADDR);}) #define MFRAME_ARGS int #define MFRAME_INIT_ARGS(CUM, RTYPE) ((CUM) = 0) #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \ ({ \ const char* type = (TYPE); \ int align = objc_alignof_type(type); \ int size = objc_sizeof_type(type); \ \ (TYPE) = objc_skip_typespec(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)) \ { \ (STACK) = (CUM) + ROUND(size, align); \ } \ else \ { \ if (size < sizeof(int)) \ { \ size = sizeof(int); \ } \ (STACK) = (CUM) + size; \ } \ (CUM) += size; \ })