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

信息检索与抽取

开发平台:

Unix_Linux

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