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

信息检索与抽取

开发平台:

Unix_Linux

  1. /* See ../README for copyright */
  2. #define MFRAME_STACK_STRUCT 1
  3. #define MFRAME_STRUCT_BYREF 1
  4. #define MFRAME_SMALL_STRUCT 8
  5. #define MFRAME_ARGS_SIZE 56
  6. #define MFRAME_RESULT_SIZE 16
  7. #define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) 
  8. ((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? 
  9.       **(void***)(ARGS) : (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) = (ADDR);})
  13. struct hppa_args {
  14.   unsigned reg_offset;
  15.   int stack_offset;
  16.   unsigned count;
  17. };
  18. #define MFRAME_ARGS struct hppa_args
  19. #define MFRAME_INIT_ARGS(CUM, RTYPE) 
  20. ({ 
  21.  (CUM).reg_offset = 20; 
  22.  (CUM).stack_offset = -20; 
  23.  (CUM).count = 0; 
  24. })
  25. #define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) 
  26. ({  
  27.   const char* type = (TYPE); 
  28.   BOOL double_flag = *type == _C_DBL; 
  29.   unsigned offset; 
  30.   BOOL register_flag; 
  31.   
  32.   (TYPE) = objc_skip_typespec (type); 
  33.   
  34.   register_flag = ((CUM).count < (double_flag ? 3 : 4)); 
  35.   offset = register_flag ? (CUM).reg_offset : (CUM).stack_offset; 
  36.   if (double_flag && (offset & 7)) 
  37.     offset -= 4; 
  38.   sprintf ((DEST), "%.*s%s%d", ((TYPE) - type), type, 
  39.     register_flag ? "+" : "", offset); 
  40.   if (*(TYPE) == '+') 
  41.     (TYPE)++; 
  42.   while (isDigit (*(TYPE))) 
  43.     { 
  44.       (TYPE)++; 
  45.     } 
  46.   (DEST)=&(DEST)[strlen (DEST)]; 
  47.   if (double_flag) 
  48.     (CUM).count++; 
  49.   if (register_flag) 
  50.     (CUM).reg_offset = offset - 4; 
  51.   else 
  52.     (CUM).stack_offset = offset - 4; 
  53.   (CUM).count++; 
  54. })