In libobjc/: 2010-12-16 Nicola Pero <nicola.pero@meta-innovation.com>

In libobjc/:
2010-12-16  Nicola Pero  <nicola.pero@meta-innovation.com>

	* sendmsg.c: Include objc/runtime.h instead of objc/objc-api.h.
	Include objc-private/module-abi-8.h and objc-private/selector.h
	instead of objc/encoding.h.
	(objc_msg_lookup_super): Use super->super_class instead of
	super->class.
	(method_get_first_argument, method_get_next_argument): Declare
	locally.
	(class_get_instance_method): Declare before using.
	(objc_msg_sendv): Use 'struct objc_method' instead of 'Method'.
	(__objc_init_dispatch_tables, __objc_send_initialize): Use
	sel_registerName() instead of sel_register_name().
	(__objc_forward): Use sel_getName() instead of sel_get_name().
	(objc_get_uninstalled_dtable): Use 'void' as argument.
	* objc-private/selector.h: New.

From-SVN: r167961
This commit is contained in:
Nicola Pero 2010-12-16 22:52:48 +00:00 committed by Nicola Pero
parent 7470b8fc5e
commit 114dae4330
3 changed files with 92 additions and 13 deletions

View File

@ -1,3 +1,20 @@
2010-12-16 Nicola Pero <nicola.pero@meta-innovation.com>
* sendmsg.c: Include objc/runtime.h instead of objc/objc-api.h.
Include objc-private/module-abi-8.h and objc-private/selector.h
instead of objc/encoding.h.
(objc_msg_lookup_super): Use super->super_class instead of
super->class.
(method_get_first_argument, method_get_next_argument): Declare
locally.
(class_get_instance_method): Declare before using.
(objc_msg_sendv): Use 'struct objc_method' instead of 'Method'.
(__objc_init_dispatch_tables, __objc_send_initialize): Use
sel_registerName() instead of sel_register_name().
(__objc_forward): Use sel_getName() instead of sel_get_name().
(objc_get_uninstalled_dtable): Use 'void' as argument.
* objc-private/selector.h: New.
2010-12-15 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/message.h (objc_super): When using the modern API, do not

View File

@ -0,0 +1,52 @@
/* GNU Objective C Runtime selector implementation - Private functions
Copyright (C) 2010 Free Software Foundation, Inc.
Contributed by Nicola Pero <nicola.pero@meta-innovation.com>
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_private_selector_INCLUDE_GNU
#define __objc_private_selector_INCLUDE_GNU
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Private runtime functions that may go away or be rewritten or
replaced. */
/* Return whether a selector is mapped or not ("mapped" meaning that
it has been inserted into the selector table). This is private as
only the runtime should ever encounter or need to know about
unmapped selectors. */
BOOL sel_is_mapped (SEL aSel);
/* Return selector representing name without registering it if it
doesn't exist. Typically used internally by the runtime when it's
looking up methods that may or may not exist (such as +initialize)
in the most efficient way. */
SEL
sel_get_any_uid (const char *name);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* not __objc_private_selector_INCLUDE_GNU */

View File

@ -33,11 +33,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "tconfig.h"
#include "coretypes.h"
#include "tm.h"
#include "objc/objc-api.h"
#include "objc/runtime.h"
#include "objc/thr.h"
#include "objc-private/module-abi-8.h"
#include "objc-private/runtime.h"
#include "objc-private/sarray.h"
#include "objc/encoding.h"
#include "objc-private/selector.h" /* For sel_is_mapped() */
#include "runtime-info.h"
#include <assert.h> /* For assert */
#include <string.h> /* For strlen */
@ -50,7 +51,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define gen_rtx(args...) 1
#define gen_rtx_MEM(args...) 1
#define gen_rtx_REG(args...) 1
/* Alread defined in gcc/coretypes.h. So prevent double definition warning. */
/* Already defined in gcc/coretypes.h. So prevent double definition warning. */
#undef rtx
#define rtx int
@ -448,17 +449,26 @@ IMP
objc_msg_lookup_super (struct objc_super *super, SEL sel)
{
if (super->self)
return get_imp (super->class, sel);
return get_imp (super->super_class, sel);
else
return (IMP)nil_method;
}
int method_get_sizeof_arguments (Method *);
/* Temporarily defined here until objc_msg_sendv() goes away. */
char *method_get_first_argument (struct objc_method *,
arglist_t argframe,
const char **type);
char *method_get_next_argument (arglist_t argframe,
const char **type);
int method_get_sizeof_arguments (struct objc_method *);
struct objc_method *
class_get_instance_method (Class class, SEL op);
retval_t
objc_msg_sendv (id object, SEL op, arglist_t arg_frame)
{
Method *m = class_get_instance_method (object->class_pointer, op);
struct objc_method *m = class_get_instance_method (object->class_pointer, op);
const char *type;
*((id *) method_get_first_argument (m, arg_frame, &type)) = object;
*((SEL *) method_get_next_argument (arg_frame, &type)) = op;
@ -473,8 +483,8 @@ __objc_init_dispatch_tables ()
__objc_uninstalled_dtable = sarray_new (200, 0);
/* TODO: It would be cool to register typed selectors here. */
selector_resolveClassMethod = sel_register_name ("resolveClassMethod:");
selector_resolveInstanceMethod =sel_register_name ("resolveInstanceMethod:");
selector_resolveClassMethod = sel_registerName ("resolveClassMethod:");
selector_resolveInstanceMethod =sel_registerName ("resolveInstanceMethod:");
}
/* This function is called by objc_msg_lookup when the dispatch table
@ -548,7 +558,7 @@ __objc_send_initialize (Class class)
__objc_send_initialize (class->super_class);
{
SEL op = sel_register_name ("initialize");
SEL op = sel_registerName ("initialize");
IMP imp = 0;
struct objc_method_list * method_list = class->class_pointer->methods;
@ -750,7 +760,7 @@ class_addMethod (Class class_, SEL selector, IMP implementation,
|| method_types == NULL || (strcmp (method_types, "") == 0))
return NO;
method_name = sel_get_name (selector);
method_name = sel_getName (selector);
if (method_name == NULL)
return NO;
@ -953,14 +963,14 @@ __objc_forward (id object, SEL sel, arglist_t args)
/* The object doesn't recognize the method. Check for responding to
error:. If it does then sent it. */
{
char msg[256 + strlen ((const char *) sel_get_name (sel))
char msg[256 + strlen ((const char *) sel_getName (sel))
+ strlen ((const char *) object->class_pointer->name)];
sprintf (msg, "(%s) %s does not recognize %s",
(CLS_ISMETA (object->class_pointer)
? "class"
: "instance" ),
object->class_pointer->name, sel_get_name (sel));
object->class_pointer->name, sel_getName (sel));
/* TODO: support for error: is surely deprecated ? */
err_sel = sel_get_any_uid ("error:");
@ -1012,7 +1022,7 @@ __objc_print_dtable_stats ()
dispatch table points to __objc_uninstalled_dtable then that means
it needs its dispatch table to be installed. */
struct sarray *
objc_get_uninstalled_dtable ()
objc_get_uninstalled_dtable (void)
{
return __objc_uninstalled_dtable;
}