next_mapping.h

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C头文件 代码 · 共 918 行 · 第 1/2 页

H
918
字号
  return type;}/*  Skip one typespec element.  If the typespec is prepended by type  qualifiers, these are skipped as well.*/const char *objc_skip_typespec (const char *type){  /* Skip the variable name if any */  if (*type == '"')    {      for (type++; *type++ != '"';)	/* do nothing */;    }  type = objc_skip_type_qualifiers (type);  switch (*type) {  case _C_ID:    /* An id may be annotated by the actual type if it is known       with the @"ClassName" syntax */    if (*++type != '"')      return type;    else      {	while (*++type != '"')	  /* do nothing */;	return type + 1;      }    /* The following are one character type codes */  case _C_CLASS:  case _C_SEL:  case _C_CHR:  case _C_UCHR:  case _C_CHARPTR:  case _C_ATOM:  case _C_SHT:  case _C_USHT:  case _C_INT:  case _C_UINT:  case _C_LNG:  case _C_ULNG:  case _C_LNG_LNG:  case _C_ULNG_LNG:  case _C_FLT:  case _C_DBL:  case _C_VOID:  case _C_UNDEF:    return ++type;    break;  case _C_ARY_B:    /* skip digits, typespec and closing ']' */    while (isdigit ((unsigned char)*++type))      ;    type = objc_skip_typespec (type);    if (*type == _C_ARY_E)      return ++type;    else      break; /* error */  case _C_BFLD:      /* The NeXT encoding for bitfields is _still_: b 'size' */    while (isdigit ((unsigned char)*++type))      ;	/* skip type and size */    return type;  case _C_STRUCT_B:    /* skip name, and elements until closing '}'  */    while (*type != _C_STRUCT_E && *type++ != '=')      ;    while (*type != _C_STRUCT_E)      {	type = objc_skip_typespec (type);      }    return ++type;  case _C_UNION_B:    /* skip name, and elements until closing ')'  */    while (*type != _C_UNION_E && *type++ != '=')      ;    while (*type != _C_UNION_E)      {	type = objc_skip_typespec (type);      }    return ++type;  case _C_PTR:    /* Just skip the following typespec */    return objc_skip_typespec (++type);  }  return 0; /* error */}/*  Skip an offset as part of a method encoding.  This is prepended by a  '+' if the argument is passed in registers.*/inline const char *objc_skip_offset (const char *type){  if (*type == '+')    type++;  while (isdigit ((unsigned char) *++type))    ;  return type;}/*  Skip an argument specification of a method encoding.*/const char *objc_skip_argspec (const char *type){  type = objc_skip_typespec (type);  type = objc_skip_offset (type);  return type;}/*  Return the number of arguments that the method MTH expects.  Note that all methods need two implicit arguments `self' and  `_cmd'.*/intmethod_get_number_of_arguments (struct objc_method *mth){  int i = 0;  const char *type = mth->method_types;  while (*type)    {      type = objc_skip_argspec (type);      i += 1;    }  return i - 1;}/*  Return the size of the argument block needed on the stack to invoke  the method MTH.  This may be zero, if all arguments are passed in  registers.*/intmethod_get_sizeof_arguments (struct objc_method *mth){  const char *type = objc_skip_typespec (mth->method_types);  return atoi (type);}/*  Return a pointer to the next argument of ARGFRAME.  type points to  the last argument.  Typical use of this look like:  {    char *datum, *type;    for (datum = method_get_first_argument (method, argframe, &type);         datum; datum = method_get_next_argument (argframe, &type))      {        unsigned flags = objc_get_type_qualifiers (type);        type = objc_skip_type_qualifiers (type);	if (*type != _C_PTR)          [portal encodeData: datum ofType: type];	else	  {	    if ((flags & _F_IN) == _F_IN)              [portal encodeData: *(char **) datum ofType: ++type];	  }      }  }*/char *method_get_next_argument (arglist_t argframe, const char **type){  const char *t = objc_skip_argspec (*type);  if (*t == '\0')    return 0;  *type = t;  t = objc_skip_typespec (t);  if (*t == '+')    return argframe->arg_regs + atoi (++t);  else    return argframe->arg_ptr + atoi (t);}/*  Return a pointer to the value of the first argument of the method  described in M with the given argumentframe ARGFRAME.  The type  is returned in TYPE.  type must be passed to successive calls of  method_get_next_argument.*/char *method_get_first_argument (struct objc_method *m,			   arglist_t argframe,			   const char **type){  *type = m->method_types;  return method_get_next_argument (argframe, type);}/*   Return a pointer to the ARGth argument of the method   M from the frame ARGFRAME.  The type of the argument   is returned in the value-result argument TYPE*/char *method_get_nth_argument (struct objc_method *m,			 arglist_t argframe, int arg,			 const char **type){  const char *t = objc_skip_argspec (m->method_types);  if (arg > method_get_number_of_arguments (m))    return 0;  while (arg--)    t = objc_skip_argspec (t);  *type = t;  t = objc_skip_typespec (t);  if (*t == '+')    return argframe->arg_regs + atoi (++t);  else    return argframe->arg_ptr + atoi (t);}unsignedobjc_get_type_qualifiers (const char *type){  unsigned res = 0;  BOOL flag = YES;  while (flag)    switch (*type++)      {      case _C_CONST:	res |= _F_CONST; break;      case _C_IN:	res |= _F_IN; break;      case _C_INOUT:	res |= _F_INOUT; break;      case _C_OUT:	res |= _F_OUT; break;      case _C_BYCOPY:	res |= _F_BYCOPY; break;      case _C_BYREF:  res |= _F_BYREF; break;      case _C_ONEWAY:	res |= _F_ONEWAY; break;      case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;      default: flag = NO;    }  return res;}/* The following three functions can be used to determine how a   structure is laid out by the compiler. For example:  struct objc_struct_layout layout;  int i;  objc_layout_structure (type, &layout);  while (objc_layout_structure_next_member (&layout))    {      int position, align;      const char *type;      objc_layout_structure_get_info (&layout, &position, &align, &type);      printf ("element %d has offset %d, alignment %d\n",              i++, position, align);    }  These functions are used by objc_sizeof_type and objc_alignof_type  functions to compute the size and alignment of structures. The  previous method of computing the size and alignment of a structure  was not working on some architectures, particulary on AIX, and in  the presence of bitfields inside the structure. */voidobjc_layout_structure (const char *type,                           struct objc_struct_layout *layout){  const char *ntype;  layout->original_type = ++type;  /* Skip "<name>=" if any. Avoid embedded structures and unions. */  ntype = type;  while (*ntype != _C_STRUCT_E && *ntype != _C_STRUCT_B && *ntype != _C_UNION_B         && *ntype++ != '=')    /* do nothing */;  /* If there's a "<name>=", ntype - 1 points to '='; skip the the name */  if (*(ntype - 1) == '=')    type = ntype;  layout->type = type;  layout->prev_type = NULL;  layout->record_size = 0;  layout->record_align = MAX (BITS_PER_UNIT, STRUCTURE_SIZE_BOUNDARY);}BOOLobjc_layout_structure_next_member (struct objc_struct_layout *layout){  register int desired_align = 0;  /* The current type without the type qualifiers */  const char *type;  /* Add the size of the previous field to the size of the record.  */  if (layout->prev_type)    {      type = objc_skip_type_qualifiers (layout->prev_type);      if (*type != _C_BFLD)        layout->record_size += objc_sizeof_type (type) * BITS_PER_UNIT;      else	layout->record_size += atoi (++type);    }  if (*layout->type == _C_STRUCT_E)    return NO;  /* Skip the variable name if any */  if (*layout->type == '"')    {      for (layout->type++; *layout->type++ != '"';)        /* do nothing */;    }  type = objc_skip_type_qualifiers (layout->type);  desired_align = objc_alignof_type (type) * BITS_PER_UNIT;  /* Record must have at least as much alignment as any field.     Otherwise, the alignment of the field within the record     is meaningless.  */  layout->record_align = MAX (layout->record_align, desired_align);  if (*type == _C_BFLD)    {      int bfld_size = atoi (++type);      int int_align = __alignof__ (int) * BITS_PER_UNIT;      /* If this bitfield would traverse a word alignment boundary, push it out 	 to that boundary instead.  */      if (layout->record_size % int_align	  && (layout->record_size / int_align	      < (layout->record_size + bfld_size - 1) / int_align))	layout->record_size = ROUND (layout->record_size, int_align);    }  else if (layout->record_size % desired_align != 0)    {      /* We need to skip space before this field.         Bump the cumulative size to multiple of field alignment.  */      layout->record_size = ROUND (layout->record_size, desired_align);    }  /* Jump to the next field in record. */  layout->prev_type = layout->type;  layout->type = objc_skip_typespec (layout->type);      /* skip component */  return YES;}void objc_layout_finish_structure (struct objc_struct_layout *layout,                                   unsigned int *size,                                   unsigned int *align){  if (layout->type && *layout->type == _C_STRUCT_E)    {      /* Round the size up to be a multiple of the required alignment */      layout->record_size = ROUND (layout->record_size, layout->record_align);      layout->type = NULL;    }  if (size)    *size = layout->record_size / BITS_PER_UNIT;  if (align)    *align = layout->record_align / BITS_PER_UNIT;}void objc_layout_structure_get_info (struct objc_struct_layout *layout,                                     unsigned int *offset,                                     unsigned int *align,                                     const char **type){  if (offset)    *offset = layout->record_size / BITS_PER_UNIT;  if (align)    *align = layout->record_align / BITS_PER_UNIT;  if (type)    *type = layout->prev_type;}/* A small, portable NSConstantString implementation for use with the NeXT   runtime.      On full-fledged Mac OS X systems, NSConstantString is provided   as part of the Foundation framework.  However, on bare Darwin systems,   Foundation is not included, and hence there is no NSConstantString    implementation to link against.   This code is derived from the GNU runtime's NXConstantString implementation.*/struct objc_class _NSConstantStringClassReference;@interface NSConstantString : Object{  char *c_string;  unsigned int len;}-(const char *) cString;-(unsigned int) length;@end@implementation NSConstantString-(const char *) cString{  return (c_string);}-(unsigned int) length{  return (len);}@end/* The NSConstantString metaclass will need to be initialized before we can   send messages to strings.  */void objc_constant_string_init (void) __attribute__((constructor));void objc_constant_string_init (void) {  memcpy (&_NSConstantStringClassReference,	  objc_getClass ("NSConstantString"),	  sizeof (_NSConstantStringClassReference));}#endif  /* #ifdef __NEXT_RUNTIME__ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?