(root)/
gcc-13.2.0/
gcc/
testsuite/
objc-obj-c++-shared/
runtime.h
       1  /* Wrapper around <objc/runtime.h>
       2     Copyright (C) 2011 Free Software Foundation, Inc.
       3     Contributed by Nicola Pero
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify
       8  it under the terms of the GNU General Public License as published by
       9  the Free Software Foundation; either version 3, or (at your option)
      10  any later version.
      11  
      12  GCC is distributed in the hope that it will be useful,
      13  but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15  GNU General Public License for more details.
      16  
      17  You should have received a copy of the GNU General Public License
      18  along with GCC; see the file COPYING3.  If not see
      19  <http://www.gnu.org/licenses/>.  */
      20  
      21  #ifndef _TESTSUITE_RUNTIME_H_
      22  #define _TESTSUITE_RUNTIME_H_
      23  
      24  /* Include this file where you'd normally include <objc/runtime.h>.
      25  
      26     Older versions of the NeXT runtime do not have <objc/runtime.h> and
      27     you need to include <objc/objc-runtime.h> instead.  This file takes
      28     care of figuring out if that's the case.  */
      29  
      30  #ifndef __NEXT_RUNTIME__
      31  
      32  /*
      33    GNU Objective-C runtime (libobjc).
      34  */
      35  # include <objc/runtime.h>
      36  
      37  #else
      38  
      39  /*
      40    NeXT Objective-C runtime.
      41  */
      42  
      43  /* Include next-abi.h to determine which version of the runtime we are
      44     dealing with.  TODO: If this is the only place including it, maybe
      45     it could be copied here ?  */
      46  # include "next-abi.h"
      47  
      48  # ifdef NEXT_OBJC_USE_NEW_INTERFACE
      49  
      50  /* New NeXT runtime, with an API that should be basically identical to
      51     the GNU Objective-C one.  */
      52  #  include <objc/runtime.h>
      53  
      54  # else
      55  
      56  /* Old NeXT runtime, with an API similar, but not identical to the new
      57     one.  To start with, different headers need to be included.  */
      58  #  include <objc/objc-class.h>
      59  #  include <objc/objc-runtime.h>
      60  
      61  /* Not all functions are available in the old NeXT runtime.  A few
      62     that we need are not, and here we provide an implementation on top
      63     of the old NeXT API.  */
      64  
      65  #  define class_isMetaClass(C) (CLS_GETINFO((struct objc_class *)C, CLS_META)? YES: NO)
      66  #  define class_getName(C) object_getClassName(C)
      67  #  define class_getSuperclass(C)  (((struct objc_class *)C)->super_class)
      68  #  define method_getImplementation(M) (((Method)M)->method_imp)
      69  #  define method_getTypeEncoding(M) (((Method)M)->method_types)
      70  #  define object_getClass(O) (*(struct objc_class **)O)
      71  
      72  #include <objc/Protocol.h>
      73  BOOL class_conformsToProtocol (Class class_, Protocol *protocol)
      74  {
      75    struct objc_protocol_list *p;
      76    int i;
      77    for (p = class_->protocols; p; p = p->next)
      78      for (i = 0; i < p->count; i++)
      79        if ([p->list[i] conformsTo: protocol])
      80  	return YES;
      81    return NO;
      82  }
      83  
      84  #define protocol_getName(P) [P name]
      85  #define protocol_isEqual(P,Q) [P isEqual: Q]
      86  
      87  struct objc_method_description protocol_getMethodDescription (Protocol *protocol, 
      88  							      SEL selector,
      89  							      BOOL requiredMethod,
      90  							      BOOL instanceMethod)
      91  {
      92    struct objc_method_description *tmp;
      93    struct objc_method_description result;
      94  
      95    if (instanceMethod)
      96      tmp = [protocol descriptionForInstanceMethod: selector];
      97    else
      98      tmp = [protocol descriptionForClassMethod: selector];
      99  
     100    if (tmp)
     101      result = *tmp;
     102    else
     103      {
     104        result.name = (SEL)0;
     105        result.types = (char *)0;
     106      }
     107  
     108    return result;
     109  }
     110  
     111  #  endif /* NEXT_OBJC_USE_NEW_INTERFACE */
     112  
     113  # endif /* __NEXT_RUNTIME__ */
     114  
     115  #endif /* _TESTSUITE_RUNTIME_H_ */
     116