mframe-generic.h
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:2k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. /* See ../README for copyright */
  2. #define MFRAME_STACK_STRUCT 0
  3. #define MFRAME_STRUCT_BYREF 0
  4. #define MFRAME_SMALL_STRUCT 8
  5. #define MFRAME_ARGS_SIZE 128
  6. #define MFRAME_RESULT_SIZE 128
  7. #define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) 
  8. (((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) && 
  9.     objc_sizeof_type(TYPES) > MFRAME_SMALL_STRUCT) ? 
  10.       *(void**)((ARGS)->arg_ptr + sizeof(void*)) : (void*)0)
  11. #define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) 
  12. ({if ((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || 
  13.     *(TYPES)==_C_ARY_B) && 
  14.     objc_sizeof_type(TYPES) > MFRAME_SMALL_STRUCT) 
  15.       *(void**)((ARGS)->arg_ptr + sizeof(void*)) = (ADDR);})
  16. #define MFRAME_ARGS int
  17. #define MFRAME_INIT_ARGS(CUM, RTYPE)
  18. ((CUM) = ((*(RTYPE)==_C_STRUCT_B || *(RTYPE)==_C_UNION_B || 
  19.     *(RTYPE)==_C_ARY_B) && 
  20.     objc_sizeof_type(RTYPE) > MFRAME_SMALL_STRUCT) 
  21.     ? sizeof(void*) : 0)
  22. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  23. ({  
  24.   const char* type = (TYPE); 
  25.   int align = objc_alignof_type(type); 
  26.   int size = objc_sizeof_type(type); 
  27.   (CUM) = ROUND((CUM), align); 
  28.   (TYPE) = objc_skip_typespec(type); 
  29.   sprintf((DEST), "%.*s%d", (int) ((TYPE)-type), type, (CUM)); 
  30.   if (*(TYPE) == '+') 
  31.     { 
  32.       (TYPE)++; 
  33.     } 
  34.   while (isDigit (*(TYPE))) 
  35.     { 
  36.       (TYPE)++; 
  37.     } 
  38.   (DEST)=&(DEST)[strlen(DEST)]; 
  39.   if ((*type==_C_STRUCT_B || *type==_C_UNION_B || *type==_C_ARY_B)) 
  40.     { 
  41.       (STACK) = (CUM) + ROUND(size, align); 
  42.     } 
  43.   else 
  44.     { 
  45.       (STACK) = (CUM) + size; 
  46.     } 
  47.   (CUM) += ROUND(size, sizeof(void*)); 
  48. })