mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			152 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| /* Basic data types for Objective C.
 | |
|    Copyright (C) 1993-2015 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GCC.
 | |
| 
 | |
| GCC is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 3, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GCC is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| GNU General Public License for more details.
 | |
| 
 | |
| Under Section 7 of GPL version 3, you are granted additional
 | |
| permissions described in the GCC Runtime Library Exception, version
 | |
| 3.1, as published by the Free Software Foundation.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License and
 | |
| a copy of the GCC Runtime Library Exception along with this program;
 | |
| see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 | |
| <http://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| #ifndef __objc_INCLUDE_GNU
 | |
| #define __objc_INCLUDE_GNU
 | |
| 
 | |
| /* This file contains the definition of the basic types used by the
 | |
|    Objective-C language.  It needs to be included to do almost
 | |
|    anything with Objective-C.  */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #include <stddef.h>
 | |
| 
 | |
| /* The current version of the GNU Objective-C Runtime library in
 | |
|    compressed ISO date format.  This should be updated any time a new
 | |
|    version is released with changes to the public API (there is no
 | |
|    need to update it if there were no API changes since the previous
 | |
|    release).  This macro is only defined starting with the GNU
 | |
|    Objective-C Runtime shipped with GCC 4.6.0.  If it is not defined,
 | |
|    it is either an older version of the runtime, or another runtime.  */
 | |
| #define __GNU_LIBOBJC__ 20110608
 | |
| 
 | |
| /* Definition of the boolean type.
 | |
| 
 | |
|    Compatibility note: the Apple/NeXT runtime defines a BOOL as a
 | |
|    'signed char'.  The GNU runtime uses an 'unsigned char'.
 | |
| 
 | |
|    Important: this could change and we could switch to 'typedef bool
 | |
|    BOOL' in the future.  Do not depend on the type of BOOL.  */
 | |
| #undef BOOL
 | |
| typedef unsigned char  BOOL;
 | |
| 
 | |
| #define YES   (BOOL)1
 | |
| #define NO    (BOOL)0
 | |
| 
 | |
| /* The basic Objective-C types (SEL, Class, id) are defined as pointer
 | |
|    to opaque structures.  The details of the structures are private to
 | |
|    the runtime and may potentially change from one version to the
 | |
|    other.  */
 | |
| 
 | |
| /* A SEL (selector) represents an abstract method (in the
 | |
|    object-oriented sense) and includes all the details of how to
 | |
|    invoke the method (which means its name, arguments and return
 | |
|    types) but provides no implementation of its own.  You can check
 | |
|    whether a class implements a selector or not, and if you have a
 | |
|    selector and know that the class implements it, you can use it to
 | |
|    call the method for an object in the class.  */
 | |
| typedef const struct objc_selector *SEL;
 | |
| 
 | |
| /* A Class is a class (in the object-oriented sense).  In Objective-C
 | |
|    there is the complication that each Class is an object itself, and
 | |
|    so belongs to a class too.  This class that a class belongs to is
 | |
|    called its 'meta class'.  */
 | |
| typedef struct objc_class *Class;
 | |
| 
 | |
| /* An 'id' is an object of an unknown class.  The way the object data
 | |
|    is stored inside the object is private and what you see here is
 | |
|    only the beginning of the actual struct.  The first field is always
 | |
|    a pointer to the Class that the object belongs to.  */
 | |
| typedef struct objc_object
 | |
| {
 | |
|   /* 'class_pointer' is the Class that the object belongs to.  In case
 | |
|      of a Class object, this pointer points to the meta class.
 | |
| 
 | |
|      Compatibility Note: The Apple/NeXT runtime calls this field
 | |
|      'isa'.  To access this field, use object_getClass() from
 | |
|      runtime.h, which is an inline function so does not add any
 | |
|      overhead and is also portable to other runtimes.  */
 | |
|   Class class_pointer;
 | |
| } *id;
 | |
| 
 | |
| /* 'IMP' is a C function that implements a method.  When retrieving
 | |
|    the implementation of a method from the runtime, this is the type
 | |
|    of the pointer returned.  The idea of the definition of IMP is to
 | |
|    represent a 'pointer to a general function taking an id, a SEL,
 | |
|    followed by other unspecified arguments'.  You must always cast an
 | |
|    IMP to a pointer to a function taking the appropriate, specific
 | |
|    types for that function, before calling it - to make sure the
 | |
|    appropriate arguments are passed to it.  The code generated by the
 | |
|    compiler to perform method calls automatically does this cast
 | |
|    inside method calls.  */
 | |
| typedef id (*IMP)(id, SEL, ...); 
 | |
| 
 | |
| /* 'nil' is the null object.  Messages to nil do nothing and always
 | |
|    return 0.  */
 | |
| #define nil (id)0
 | |
| 
 | |
| /* 'Nil' is the null class.  Since classes are objects too, this is
 | |
|    actually the same object as 'nil' (and behaves in the same way),
 | |
|    but it has a type of Class, so it is good to use it instead of
 | |
|    'nil' if you are comparing a Class object to nil as it enables the
 | |
|    compiler to do some type-checking.  */
 | |
| #define Nil (Class)0
 | |
| 
 | |
| /* TODO: Move the 'Protocol' declaration into objc/runtime.h.  A
 | |
|    Protocol is simply an object, not a basic Objective-C type.  The
 | |
|    Apple runtime defines Protocol in objc/runtime.h too, so it's good
 | |
|    to move it there for API compatibility.  */
 | |
| 
 | |
| /* A 'Protocol' is a formally defined list of selectors (normally
 | |
|    created using the @protocol Objective-C syntax).  It is mostly used
 | |
|    at compile-time to check that classes implement all the methods
 | |
|    that they are supposed to.  Protocols are also available in the
 | |
|    runtime system as Protocol objects.  */
 | |
| #ifndef __OBJC__
 | |
|   /* Once we stop including the deprecated struct_objc_protocol.h
 | |
|      there is no reason to even define a 'struct objc_protocol'.  As
 | |
|      all the structure details will be hidden, a Protocol basically is
 | |
|      simply an object (as it should be).  */
 | |
|   typedef struct objc_object Protocol;
 | |
| #else /* __OBJC__ */
 | |
|   @class Protocol;
 | |
| #endif 
 | |
| 
 | |
| /* Compatibility note: the Apple/NeXT runtime defines sel_getName(),
 | |
|    sel_registerName(), object_getClassName(), object_getIndexedIvars()
 | |
|    in this file while the GNU runtime defines them in runtime.h.
 | |
| 
 | |
|    The reason the GNU runtime does not define them here is that they
 | |
|    are not basic Objective-C types (defined in this file), but are
 | |
|    part of the runtime API (defined in runtime.h).  */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* not __objc_INCLUDE_GNU */
 |