From: Adam Fedor <fedor@doc.com>
To: GDB Patches <gdb-patches@sources.redhat.com>
Subject: [PING/RFA]: Search for Objc Symbols
Date: Sun, 27 Apr 2003 01:13:00 -0000 [thread overview]
Message-ID: <3EA9FF5A.2040209@doc.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 271 bytes --]
I forgot about this one:
http://sources.redhat.com/ml/gdb-patches/2003-01/msg00441.html
It doesn't apprear that this was ever formally approved. I've attached
the patch again since there have been some minor changes since then in
order to keep up with the times...
[-- Attachment #2: symtab-search.patch --]
[-- Type: text/plain, Size: 5864 bytes --]
2003-04-25 Adam Fedor <fedor@gnu.org>
* symtab.c (make_symbol_completion_list): Look for ObjC
symbols.
* Makefile.in (symtab.o): Update dependencies.
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.367
diff -u -p -r1.367 Makefile.in
--- Makefile.in 26 Apr 2003 01:57:28 -0000 1.367
+++ Makefile.in 26 Apr 2003 03:12:16 -0000
@@ -2275,7 +2275,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h)
$(gdbcmd_h) $(call_cmds_h) $(gdb_regex_h) $(expression_h) \
$(language_h) $(demangle_h) $(inferior_h) $(linespec_h) \
$(filenames_h) $(gdb_obstack_h) $(gdb_string_h) $(gdb_stat_h) \
- $(cp_abi_h) $(source_h) $(block_h)
+ $(cp_abi_h) $(source_h) $(block_h) $(objc_lang_h)
target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \
$(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
$(gdb_wait_h) $(dcache_h) $(regcache_h)
Index: symtab.c
===================================================================
RCS file: /cvs/src/src/gdb/symtab.c,v
retrieving revision 1.101
diff -u -p -r1.101 symtab.c
--- symtab.c 14 Apr 2003 19:56:32 -0000 1.101
+++ symtab.c 26 Apr 2003 03:12:21 -0000
@@ -40,6 +40,7 @@
#include "linespec.h"
#include "source.h"
#include "filenames.h" /* for FILENAME_CMP */
+#include "objc-lang.h"
#include "hashtab.h"
@@ -3527,10 +3541,69 @@ make_symbol_completion_list (char *text,
anything that isn't a text symbol (everything else will be
handled by the psymtab code above). */
+ /* ObjC: In case we are completing on a selector, look thru the msymbols
+ again and feed all the selectors into the mill. */
+
ALL_MSYMBOLS (objfile, msymbol)
{
+ static char *tmp = NULL;
+ static unsigned int tmplen = 0;
+
+ char *method, *category, *selector;
+ char *tmp2 = NULL;
+
QUIT;
- COMPLETION_LIST_ADD_SYMBOL (msymbol, sym_text, sym_text_len, text, word);
+
+ method = SYMBOL_DEMANGLED_NAME (msymbol);
+ if (method == NULL)
+ method = SYMBOL_LINKAGE_NAME (msymbol);
+ if (method == NULL)
+ continue;
+
+ /* Add the minimal symbol no matter what. */
+ completion_list_add_name (method, sym_text, sym_text_len, text, word);
+
+ /* Is it a method? */
+ if ((method[0] != '-') && (method[0] != '+'))
+ continue;
+ if (sym_text[0] == '[')
+ /* Complete on shortened method method. */
+ completion_list_add_name (method + 1, sym_text, sym_text_len, text, word);
+
+ while ((strlen (method) + 1) >= tmplen)
+ {
+ if (tmplen == 0)
+ tmplen = 1024;
+ else
+ tmplen *= 2;
+ tmp = xrealloc (tmp, tmplen);
+ }
+ selector = strchr (method, ' ');
+ if (selector != NULL)
+ selector++;
+
+ category = strchr (method, '(');
+
+ if ((category != NULL) && (selector != NULL))
+ {
+ memcpy (tmp, method, (category - method));
+ tmp[category - method] = ' ';
+ memcpy (tmp + (category - method) + 1, selector, strlen (selector) + 1);
+ completion_list_add_name (tmp, sym_text, sym_text_len, text, word);
+ if (sym_text[0] == '[')
+ completion_list_add_name (tmp + 1, sym_text, sym_text_len, text, word);
+ }
+
+ if (selector != NULL)
+ {
+ /* Complete on selector only. */
+ strcpy (tmp, selector);
+ tmp2 = strchr (tmp, ']');
+ if (tmp2 != NULL)
+ *tmp2 = '\0';
+
+ completion_list_add_name (tmp, sym_text, sym_text_len, text, word);
+ }
}
/* Search upwards from currently selected frame (so that we can
@@ -3548,6 +3621,7 @@ make_symbol_completion_list (char *text,
ALL_BLOCK_SYMBOLS (b, i, sym)
{
+ QUIT;
COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text, word);
if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
{
@@ -3653,15 +3727,45 @@ make_file_symbol_completion_list (char *
}
else
{
- /* It is not a quoted string. Break it based on the characters
- which are in symbols. */
- while (p > text)
- {
- if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0')
- --p;
- else
- break;
- }
+ /* It is not a quoted string. Break it based on the characters
+ which are in symbols. */
+ for (; p > text; --p)
+ {
+ if (isalnum (p[-1]) || p[-1] == '_' || p[-1] == '\0')
+ continue;
+ else
+ {
+ if ((current_language->la_language == language_objc))
+ {
+ if (p[-1] == ':') /* might be part of a method name */
+ continue;
+ else if (p[-1] == '[' && (p[-2] == '-' || p[-2] == '+'))
+ p -= 2; /* beginning of a method name */
+ else if (p[-1] == ' ' || p[-1] == '(' || p[-1] == ')')
+ { /* might be part of a method name */
+ char *t = p;
+
+ /* Seeing a ' ' or a '(' is not conclusive evidence
+ that we are in the middle of a method name. However,
+ finding "-[" or "+[" should be pretty un-ambiguous.
+ Unfortunately we have to find it now to decide. */
+
+ while (t > text)
+ if (isalnum (t[-1]) || t[-1] == '_' ||
+ t[-1] == ' ' || t[-1] == ':' ||
+ t[-1] == '(' || t[-1] == ')')
+ --t;
+ else
+ break;
+
+ if (t[-1] == '[' && (t[-2] == '-' || t[-2] == '+'))
+ p = t - 2; /* method name detected */
+ /* else we leave with p unchanged */
+ }
+ }
+ break;
+ }
+ }
sym_text = p;
}
}
next reply other threads:[~2003-04-26 3:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-04-27 1:13 Adam Fedor [this message]
2003-05-09 17:03 ` Elena Zannoni
2003-05-11 3:31 ` Adam Fedor
2003-05-11 18:15 ` David Carlton
2003-05-12 18:57 ` Elena Zannoni
2003-05-12 21:02 Adam Fedor
[not found] ` <3EC45470.9000704@redhat.com>
2003-05-16 4:16 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3EA9FF5A.2040209@doc.com \
--to=fedor@doc.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox