mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /* GNU Objective C Runtime messaging declarations
 | |
|    Copyright (C) 1993-2016 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_message_INCLUDE_GNU
 | |
| #define __objc_message_INCLUDE_GNU
 | |
| 
 | |
| #include "objc.h"
 | |
| #include "objc-decls.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* This file includes declarations of the messaging functions and
 | |
|    types.  */
 | |
| 
 | |
| /* Compatibility note: the messaging function is one area where the
 | |
|    GNU runtime and the Apple/NeXT runtime differ significantly.  If
 | |
|    you can, it is recommended that you use higher-level facilities
 | |
|    (provided by a Foundation library such as GNUstep Base) to perform
 | |
|    forwarding or other advanced messaging tricks.  */
 | |
| 
 | |
| /* This function returns the IMP (C function implementing a method) to
 | |
|    use to invoke the method with selector 'op' of receiver 'receiver'.
 | |
| 
 | |
|    This is the function used by the compiler when compiling method
 | |
|    invocations with the GNU runtime.  For example, the method call
 | |
| 
 | |
|      result = [receiver method];
 | |
| 
 | |
|    is compiled by the compiler (with the GNU runtime) into the
 | |
|    equivalent of:
 | |
| 
 | |
|    {
 | |
|      IMP function = objc_msg_lookup (receiver, @selector (method));
 | |
|      result = function (receiver, @selector (method));
 | |
|    }
 | |
| 
 | |
|    so, a call to objc_msg_lookup() determines the IMP (the C function
 | |
|    implementing the method) to call.  Then, the function is called.
 | |
|    If the method takes or returns different arguments, the compiler
 | |
|    will cast 'function' to the right type before invoking it, making
 | |
|    sure arguments and return value are handled correctly.
 | |
| 
 | |
|    objc_msg_lookup() must always return a valid function that can be
 | |
|    called with the required method signature (otherwise the
 | |
|    compiler-generated code shown above could segfault).  If 'receiver'
 | |
|    is NULL, objc_msg_lookup() returns a C function that does nothing,
 | |
|    ignores all its arguments, and returns NULL (see nil_method.c).  If
 | |
|    'receiver' does not respond to the selector 'op', objc_msg_lookup()
 | |
|    will try to call +resolveClassMethod: or resolveInstanceMethod: as
 | |
|    appropriate, and if they return YES, it will try the lookup again
 | |
|    (+resolveClassMethod: and +resolveInstanceMethod: can thus install
 | |
|    dynamically methods as they are requested).  If
 | |
|    +resolveClassMethod: or +resolveInstanceMethod: are either not
 | |
|    available, or return NO, or return YES but 'receiver' still doesn't
 | |
|    implement the 'selector' after calling them, the runtime returns a
 | |
|    generic "forwarding" function that can be called with the required
 | |
|    method signature and which can process the method invocation
 | |
|    according to the forwarding API.  There are two runtime hooks that
 | |
|    allow Foundation libraries (such as GNUstep-Base) to return their
 | |
|    own forwarding function in preference to the runtime ones.  When
 | |
|    that happens, the Foundation library effectively takes complete
 | |
|    control of the forwarding process; any method invocation where the
 | |
|    selector is not implemented by the receiver will end up calling a
 | |
|    forwarding function chosen by the Foundation library.  */
 | |
| objc_EXPORT IMP objc_msg_lookup (id receiver, SEL op);
 | |
| 
 | |
| /* Structure used when a message is send to a class's super class.
 | |
|    The compiler generates one of these structures and passes it to
 | |
|    objc_msg_lookup_super() when a [super method] call is compiled.  */
 | |
| 
 | |
| /* Modern API.  */
 | |
| struct objc_super
 | |
| {
 | |
|   id    self;        /* The receiver of the message.  */
 | |
|   Class super_class; /* The superclass of the receiver.  */
 | |
| };
 | |
| 
 | |
| /* This is used by the compiler instead of objc_msg_lookup () when
 | |
|    compiling a call to 'super', such as [super method].  This requires
 | |
|    sending a message to super->self, but looking up the method as if
 | |
|    super->self was in class super->super_class.  */
 | |
| objc_EXPORT IMP objc_msg_lookup_super (struct objc_super *super, SEL sel);
 | |
| 
 | |
| /* Hooks for method forwarding.  They make it easy to substitute the
 | |
|    built-in forwarding with one based on a library, such as ffi, that
 | |
|    implement closures, thereby avoiding gcc's __builtin_apply
 | |
|    problems.  __objc_msg_forward2's result will be preferred over that
 | |
|    of __objc_msg_forward if both are set and return non-NULL.  */   
 | |
| objc_EXPORT IMP (*__objc_msg_forward)(SEL);
 | |
| objc_EXPORT IMP (*__objc_msg_forward2)(id, SEL);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* not __objc_message_INCLUDE_GNU */
 |