/* Objective-C language support routines for GDB, the GNU debugger.
- Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ Copyright (C) 2002-2021 Free Software Foundation, Inc.
Contributed by Apple Computer, Inc.
Written by Michael Snyder.
#include "value.h"
#include "symfile.h"
#include "objfiles.h"
-#include "target.h" /* for target_has_execution */
+#include "target.h"
#include "gdbcore.h"
#include "gdbcmd.h"
#include "frame.h"
#include "infcall.h"
#include "valprint.h"
#include "cli/cli-utils.h"
+#include "c-exp.h"
#include <ctype.h>
#include <algorithm>
struct type *char_type = builtin_type (gdbarch)->builtin_char;
struct value * function, *classval;
- if (! target_has_execution)
+ if (! target_has_execution ())
{
/* Can't call into inferior to lookup class. */
return 0;
struct type *char_type = builtin_type (gdbarch)->builtin_char;
struct value * function, *selstring;
- if (! target_has_execution)
+ if (! target_has_execution ())
{
/* Can't call into inferior to lookup selector. */
return 0;
}
struct value *
-value_nsstring (struct gdbarch *gdbarch, char *ptr, int len)
+value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
{
struct type *char_type = builtin_type (gdbarch)->builtin_char;
struct value *stringValue[3];
struct symbol *sym;
struct type *type;
- if (!target_has_execution)
+ if (!target_has_execution ())
return 0; /* Can't call into inferior to create NSString. */
stringValue[2] = value_string(ptr, len, char_type);
return nsstringValue;
}
-/* Objective-C name demangling. */
+/* Class representing the Objective-C language. */
-char *
-objc_demangle (const char *mangled, int options)
+class objc_language : public language_defn
{
- char *demangled, *cp;
-
- if (mangled[0] == '_' &&
- (mangled[1] == 'i' || mangled[1] == 'c') &&
- mangled[2] == '_')
- {
- cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
-
- if (mangled[1] == 'i')
- *cp++ = '-'; /* for instance method */
- else
- *cp++ = '+'; /* for class method */
-
- *cp++ = '['; /* opening left brace */
- strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
-
- while (*cp && *cp == '_')
- cp++; /* Skip any initial underbars in class
- name. */
-
- cp = strchr(cp, '_');
- if (!cp) /* Find first non-initial underbar. */
- {
- xfree(demangled); /* not mangled name */
- return NULL;
- }
- if (cp[1] == '_') /* Easy case: no category name. */
- {
- *cp++ = ' '; /* Replace two '_' with one ' '. */
- strcpy(cp, mangled + (cp - demangled) + 2);
- }
- else
- {
- *cp++ = '('; /* Less easy case: category name. */
- cp = strchr(cp, '_');
- if (!cp)
- {
- xfree(demangled); /* not mangled name */
- return NULL;
- }
- *cp++ = ')';
- *cp++ = ' '; /* Overwriting 1st char of method name... */
- strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
- }
+public:
+ objc_language ()
+ : language_defn (language_objc)
+ { /* Nothing. */ }
- while (*cp && *cp == '_')
- cp++; /* Skip any initial underbars in
- method name. */
+ /* See language.h. */
- for (; *cp; cp++)
- if (*cp == '_')
- *cp = ':'; /* Replace remaining '_' with ':'. */
+ const char *name () const override
+ { return "objective-c"; }
- *cp++ = ']'; /* closing right brace */
- *cp++ = 0; /* string terminator */
- return demangled;
- }
- else
- return NULL; /* Not an objc mangled name. */
-}
+ /* See language.h. */
+ const char *natural_name () const override
+ { return "Objective-C"; }
-/* Table mapping opcodes into strings for printing operators
- and precedences of the operators. */
+ /* See language.h. */
-static const struct op_print objc_op_print_tab[] =
+ const std::vector<const char *> &filename_extensions () const override
{
- {",", BINOP_COMMA, PREC_COMMA, 0},
- {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
- {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
- {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
- {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
- {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
- {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
- {"==", BINOP_EQUAL, PREC_EQUAL, 0},
- {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
- {"<=", BINOP_LEQ, PREC_ORDER, 0},
- {">=", BINOP_GEQ, PREC_ORDER, 0},
- {">", BINOP_GTR, PREC_ORDER, 0},
- {"<", BINOP_LESS, PREC_ORDER, 0},
- {">>", BINOP_RSH, PREC_SHIFT, 0},
- {"<<", BINOP_LSH, PREC_SHIFT, 0},
- {"+", BINOP_ADD, PREC_ADD, 0},
- {"-", BINOP_SUB, PREC_ADD, 0},
- {"*", BINOP_MUL, PREC_MUL, 0},
- {"/", BINOP_DIV, PREC_MUL, 0},
- {"%", BINOP_REM, PREC_MUL, 0},
- {"@", BINOP_REPEAT, PREC_REPEAT, 0},
- {"-", UNOP_NEG, PREC_PREFIX, 0},
- {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
- {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
- {"*", UNOP_IND, PREC_PREFIX, 0},
- {"&", UNOP_ADDR, PREC_PREFIX, 0},
- {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
- {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
- {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
- {NULL, OP_NULL, PREC_NULL, 0}
-};
-
-static const char *objc_extensions[] =
-{
- ".m", NULL
-};
-
-/* Constant data representing the Objective-C language. */
-
-extern const struct language_data objc_language_data =
-{
- "objective-c", /* Language name */
- "Objective-C",
- language_objc,
- range_check_off,
- case_sensitive_on,
- array_row_major,
- macro_expansion_c,
- objc_extensions,
- &exp_descriptor_standard,
- c_printstr, /* Function to print string constant */
- c_print_typedef, /* Print a typedef using appropriate syntax */
- "self", /* name_of_this */
- false, /* la_store_sym_names_in_linkage_form_p */
- objc_op_print_tab, /* Expression operators for printing */
- 1, /* C-style arrays */
- 0, /* String lower bound */
- &default_varobj_ops,
- c_is_string_type_p,
- "{...}" /* la_struct_too_deep_ellipsis */
-};
-
-/* Class representing the Objective-C language. */
-
-class objc_language : public language_defn
-{
-public:
- objc_language ()
- : language_defn (language_objc, objc_language_data)
- { /* Nothing. */ }
+ static const std::vector<const char *> extensions = { ".m" };
+ return extensions;
+ }
/* See language.h. */
void language_arch_info (struct gdbarch *gdbarch,
bool sniff_from_mangled_name (const char *mangled,
char **demangled) const override
{
- *demangled = objc_demangle (mangled, 0);
+ *demangled = demangle_symbol (mangled, 0);
return *demangled != NULL;
}
/* See language.h. */
- char *demangle (const char *mangled, int options) const override
- {
- return objc_demangle (mangled, options);
- }
+ char *demangle_symbol (const char *mangled, int options) const override;
/* See language.h. */
return real_stop_pc;
}
+
+ /* See language.h. */
+
+ const char *name_of_this () const override
+ { return "self"; }
+
+ /* See language.h. */
+
+ enum macro_expansion macro_expansion () const override
+ { return macro_expansion_c; }
};
+/* See declaration of objc_language::demangle_symbol above. */
+
+char *
+objc_language::demangle_symbol (const char *mangled, int options) const
+{
+ char *demangled, *cp;
+
+ if (mangled[0] == '_'
+ && (mangled[1] == 'i' || mangled[1] == 'c')
+ && mangled[2] == '_')
+ {
+ cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
+
+ if (mangled[1] == 'i')
+ *cp++ = '-'; /* for instance method */
+ else
+ *cp++ = '+'; /* for class method */
+
+ *cp++ = '['; /* opening left brace */
+ strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
+
+ while (*cp != '\0' && *cp == '_')
+ cp++; /* Skip any initial underbars in class
+ name. */
+
+ cp = strchr(cp, '_');
+ if (cp == nullptr) /* Find first non-initial underbar. */
+ {
+ xfree(demangled); /* not mangled name */
+ return nullptr;
+ }
+ if (cp[1] == '_') /* Easy case: no category name. */
+ {
+ *cp++ = ' '; /* Replace two '_' with one ' '. */
+ strcpy(cp, mangled + (cp - demangled) + 2);
+ }
+ else
+ {
+ *cp++ = '('; /* Less easy case: category name. */
+ cp = strchr(cp, '_');
+ if (cp == nullptr)
+ {
+ xfree(demangled); /* not mangled name */
+ return nullptr;
+ }
+ *cp++ = ')';
+ *cp++ = ' '; /* Overwriting 1st char of method name... */
+ strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
+ }
+
+ while (*cp != '\0' && *cp == '_')
+ cp++; /* Skip any initial underbars in
+ method name. */
+
+ for (; *cp != '\0'; cp++)
+ if (*cp == '_')
+ *cp = ':'; /* Replace remaining '_' with ':'. */
+
+ *cp++ = ']'; /* closing right brace */
+ *cp++ = 0; /* string terminator */
+ return demangled;
+ }
+ else
+ return nullptr; /* Not an objc mangled name. */
+}
+
/* Single instance of the class representing the Objective-C language. */
static objc_language objc_language_defn;
char *p = msglist_sel;
CORE_ADDR selid;
+ std::vector<expr::operation_up> args = ps->pop_vector (val);
+ expr::operation_up target = ps->pop ();
+
selname_chain = sel->next;
msglist_len = sel->msglist_len;
msglist_sel = sel->msglist_sel;
selid = lookup_child_selector (ps->gdbarch (), p);
if (!selid)
error (_("Can't find selector \"%s\""), p);
- write_exp_elt_longcst (ps, selid);
+
+ ps->push_new<expr::objc_msgcall_operation> (selid, std::move (target),
+ std::move (args));
+
xfree(p);
- write_exp_elt_longcst (ps, val); /* Number of args */
xfree(sel);
return val;
{
expression_up expr = parse_expression (args);
- int pc = 0;
- object = evaluate_subexp (builtin_type (expr->gdbarch)->builtin_data_ptr,
- expr.get (), &pc, EVAL_NORMAL);
+ object
+ = evaluate_expression (expr.get (),
+ builtin_type (expr->gdbarch)->builtin_data_ptr);
}
/* Validate the address for sanity. */
_("All Objective-C selectors, or those matching REGEXP."));
add_info ("classes", info_classes_command,
_("All Objective-C classes, or those matching REGEXP."));
- add_com ("print-object", class_vars, print_object_command,
- _("Ask an Objective-C object to print itself."));
- add_com_alias ("po", "print-object", class_vars, 1);
+ cmd_list_element *print_object_cmd
+ = add_com ("print-object", class_vars, print_object_command,
+ _("Ask an Objective-C object to print itself."));
+ add_com_alias ("po", print_object_cmd, class_vars, 1);
}
static void