2002-09-18 Michael Snyder <msnyder@redhat.com>

Preliminary support for Objective-C:
	* defs.h (language_objc): New enum value.
	(puts_filtered_tabular): Declaration only, exported from utils.c.
	(skip_quoted): Delete, declared in completer.h.
	* c-exp.y: Include completer.h.
	* p-exp.y: Ditto.
	* jv-exp.y: Ditto.
	* expression.h (OP_MSGCALL, OP_SELECTOR, OP_SELF, OP_NSSTRING):
	New operator enum values.
	* language.h (CAST_IS_CONVERSION): Test for language_objc.
	* language.c (binop_result_type): Handle language_objc case.
	(integral_type, character_type, string_type, boolean_type,
	structured_type, binop_type_check): Ditto.
	* symtab.h (SYMBOL_OBJC_DEMANGLED_NAME): Define.
	(struct objc_specific): Add to general_symbol_info.
	(SYMBOL_INIT_LANGUAGE_SPECIFIC): Add objc initialization.
	(SYMBOL_DEMANGLED_NAME): Handle objc case.
	* parser-defs.h (struct objc_class_str): New struct type.
	(start_msglist, end_msglist, add_msglist): Declaration only,
	exported from objc-lang.c.
	* value.h (value_of_local, value_nsstring,
	call_function_by_hand_expecting_type): Exported from valops.c.
	* valops.c (find_function_addr): Export.
	(call_function_by_hand_expecting_type): New function.
	(value_of_local): New function.
	* symfile.c (init_filename_language_table): Add ".m" extension
	for Objective-C.
	* utils.c (puts_filtered_tabular): New function.
	(fprintf_symbol_filtered): Add objc demangling support (disabled).
	(set/show demangle): Extend help-string to refer to ObjC.
	* elfread.c (elf_symtab_read): Skip Objective-C special symbols.
	* stabsread.c (symbol_reference_defined): Objective-C symbols
	may contain colons: make allowances when scanning stabs strings
	for colons.
	(objc_find_colon): New function.
	* printcmd.c (address_info): If language == objc then print
	"self" instead of "this".
	* parse.c (length_of_subexp): Handle new operators OP_MSGCALL,
	OP_NSSTRING, and OP_SELF.
	(prefixify_subexp): Ditto.
	* source.c (print_source_lines): Mention objc in comment.
	* breakpoint.c (parse_breakpoint_sals): Recognize Objective-C
	method names.
This commit is contained in:
Michael Snyder
2002-09-19 01:34:51 +00:00
parent b9caf5053f
commit 3b4efeaa2d
21 changed files with 446 additions and 184 deletions

View File

@@ -48,10 +48,8 @@ extern int overload_debug;
static int typecmp (int staticp, int varargs, int nargs,
struct field t1[], struct value *t2[]);
static CORE_ADDR find_function_addr (struct value *, struct type **);
static struct value *value_arg_coerce (struct value *, struct type *, int);
static CORE_ADDR value_push (CORE_ADDR, struct value *);
static struct value *search_struct_field (char *, struct value *, int,
@@ -91,7 +89,6 @@ int overload_resolution = 0;
int unwind_on_signal_p = 0;
/* Find the address of function name NAME in the inferior. */
struct value *
@@ -1219,7 +1216,7 @@ value_arg_coerce (struct value *arg, struct type *param_type,
/* Determine a function's address and its return type from its value.
Calls error() if the function is not valid for calling. */
static CORE_ADDR
CORE_ADDR
find_function_addr (struct value *function, struct type **retval_type)
{
register struct type *ftype = check_typedef (VALUE_TYPE (function));
@@ -1889,6 +1886,23 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
error ("Cannot invoke functions on this machine.");
}
}
struct value *
call_function_by_hand_expecting_type (struct value *function,
struct type *expect_type,
int nargs, struct value **args,
int restore_frame)
{
if (CALL_DUMMY_P)
{
/* FIXME: Changes to func not implemented yet */
return hand_function_call (function, nargs, args);
}
else
{
error ("Cannot invoke functions on this machine.");
}
}
@@ -3303,21 +3317,17 @@ value_full_object (struct value *argp, struct type *rtype, int xfull, int xtop,
return new_val;
}
/* C++: return the value of the class instance variable, if one exists.
/* Return the value of the local variable, if one exists.
Flag COMPLAIN signals an error if the request is made in an
inappropriate context. */
struct value *
value_of_this (int complain)
value_of_local (const char *name, int complain)
{
struct symbol *func, *sym;
struct block *b;
int i;
static const char funny_this[] = "this";
struct value *this;
struct value * ret;
if (selected_frame == 0)
{
@@ -3331,7 +3341,7 @@ value_of_this (int complain)
if (!func)
{
if (complain)
error ("no `this' in nameless context");
error ("no %s in nameless context", name);
else
return 0;
}
@@ -3341,26 +3351,39 @@ value_of_this (int complain)
if (i <= 0)
{
if (complain)
error ("no args, no `this'");
error ("no args, no %s", name);
else
return 0;
}
/* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
symbol instead of the LOC_ARG one (if both exist). */
sym = lookup_block_symbol (b, funny_this, NULL, VAR_NAMESPACE);
sym = lookup_block_symbol (b, name, NULL, VAR_NAMESPACE);
if (sym == NULL)
{
if (complain)
error ("current stack frame not in method");
error ("current stack frame does not contain a variable named \"%s\"", name);
else
return NULL;
}
this = read_var_value (sym, selected_frame);
if (this == 0 && complain)
error ("`this' argument at unknown address");
return this;
ret = read_var_value (sym, selected_frame);
if (ret == 0 && complain)
error ("%s argument unreadable", name);
return ret;
}
/* C++/Objective-C: return the value of the class instance variable,
if one exists. Flag COMPLAIN signals an error if the request is
made in an inappropriate context. */
struct value *
value_of_this (int complain)
{
if (current_language->la_language == language_objc)
return value_of_local ("self", complain);
else
return value_of_local ("this", complain);
}
/* Create a slice (sub-string, sub-array) of ARRAY, that is LENGTH elements