cp-support.c revision 1.1.1.1 1 1.1 christos /* Helper routines for C++ support in GDB.
2 1.1 christos Copyright (C) 2002-2014 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos Contributed by MontaVista Software.
5 1.1 christos
6 1.1 christos This file is part of GDB.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1 christos #include "defs.h"
22 1.1 christos #include "cp-support.h"
23 1.1 christos #include <string.h>
24 1.1 christos #include "demangle.h"
25 1.1 christos #include "gdb_assert.h"
26 1.1 christos #include "gdbcmd.h"
27 1.1 christos #include "dictionary.h"
28 1.1 christos #include "objfiles.h"
29 1.1 christos #include "frame.h"
30 1.1 christos #include "symtab.h"
31 1.1 christos #include "block.h"
32 1.1 christos #include "complaints.h"
33 1.1 christos #include "gdbtypes.h"
34 1.1 christos #include "exceptions.h"
35 1.1 christos #include "expression.h"
36 1.1 christos #include "value.h"
37 1.1 christos #include "cp-abi.h"
38 1.1 christos
39 1.1 christos #include "safe-ctype.h"
40 1.1 christos
41 1.1 christos #define d_left(dc) (dc)->u.s_binary.left
42 1.1 christos #define d_right(dc) (dc)->u.s_binary.right
43 1.1 christos
44 1.1 christos /* Functions related to demangled name parsing. */
45 1.1 christos
46 1.1 christos static unsigned int cp_find_first_component_aux (const char *name,
47 1.1 christos int permissive);
48 1.1 christos
49 1.1 christos static void demangled_name_complaint (const char *name);
50 1.1 christos
51 1.1 christos /* Functions/variables related to overload resolution. */
52 1.1 christos
53 1.1 christos static int sym_return_val_size = -1;
54 1.1 christos static int sym_return_val_index;
55 1.1 christos static struct symbol **sym_return_val;
56 1.1 christos
57 1.1 christos static void overload_list_add_symbol (struct symbol *sym,
58 1.1 christos const char *oload_name);
59 1.1 christos
60 1.1 christos static void make_symbol_overload_list_using (const char *func_name,
61 1.1 christos const char *namespace);
62 1.1 christos
63 1.1 christos static void make_symbol_overload_list_qualified (const char *func_name);
64 1.1 christos
65 1.1 christos /* The list of "maint cplus" commands. */
66 1.1 christos
67 1.1 christos struct cmd_list_element *maint_cplus_cmd_list = NULL;
68 1.1 christos
69 1.1 christos /* The actual commands. */
70 1.1 christos
71 1.1 christos static void maint_cplus_command (char *arg, int from_tty);
72 1.1 christos static void first_component_command (char *arg, int from_tty);
73 1.1 christos
74 1.1 christos /* A list of typedefs which should not be substituted by replace_typedefs. */
75 1.1 christos static const char * const ignore_typedefs[] =
76 1.1 christos {
77 1.1 christos "std::istream", "std::iostream", "std::ostream", "std::string"
78 1.1 christos };
79 1.1 christos
80 1.1 christos static void
81 1.1 christos replace_typedefs (struct demangle_parse_info *info,
82 1.1 christos struct demangle_component *ret_comp,
83 1.1 christos canonicalization_ftype *finder,
84 1.1 christos void *data);
85 1.1 christos
86 1.1 christos /* A convenience function to copy STRING into OBSTACK, returning a pointer
87 1.1 christos to the newly allocated string and saving the number of bytes saved in LEN.
88 1.1 christos
89 1.1 christos It does not copy the terminating '\0' byte! */
90 1.1 christos
91 1.1 christos static char *
92 1.1 christos copy_string_to_obstack (struct obstack *obstack, const char *string,
93 1.1 christos long *len)
94 1.1 christos {
95 1.1 christos *len = strlen (string);
96 1.1 christos return obstack_copy (obstack, string, *len);
97 1.1 christos }
98 1.1 christos
99 1.1 christos /* A cleanup wrapper for cp_demangled_name_parse_free. */
100 1.1 christos
101 1.1 christos static void
102 1.1 christos do_demangled_name_parse_free_cleanup (void *data)
103 1.1 christos {
104 1.1 christos struct demangle_parse_info *info = (struct demangle_parse_info *) data;
105 1.1 christos
106 1.1 christos cp_demangled_name_parse_free (info);
107 1.1 christos }
108 1.1 christos
109 1.1 christos /* Create a cleanup for C++ name parsing. */
110 1.1 christos
111 1.1 christos struct cleanup *
112 1.1 christos make_cleanup_cp_demangled_name_parse_free (struct demangle_parse_info *info)
113 1.1 christos {
114 1.1 christos return make_cleanup (do_demangled_name_parse_free_cleanup, info);
115 1.1 christos }
116 1.1 christos
117 1.1 christos /* Return 1 if STRING is clearly already in canonical form. This
118 1.1 christos function is conservative; things which it does not recognize are
119 1.1 christos assumed to be non-canonical, and the parser will sort them out
120 1.1 christos afterwards. This speeds up the critical path for alphanumeric
121 1.1 christos identifiers. */
122 1.1 christos
123 1.1 christos static int
124 1.1 christos cp_already_canonical (const char *string)
125 1.1 christos {
126 1.1 christos /* Identifier start character [a-zA-Z_]. */
127 1.1 christos if (!ISIDST (string[0]))
128 1.1 christos return 0;
129 1.1 christos
130 1.1 christos /* These are the only two identifiers which canonicalize to other
131 1.1 christos than themselves or an error: unsigned -> unsigned int and
132 1.1 christos signed -> int. */
133 1.1 christos if (string[0] == 'u' && strcmp (&string[1], "nsigned") == 0)
134 1.1 christos return 0;
135 1.1 christos else if (string[0] == 's' && strcmp (&string[1], "igned") == 0)
136 1.1 christos return 0;
137 1.1 christos
138 1.1 christos /* Identifier character [a-zA-Z0-9_]. */
139 1.1 christos while (ISIDNUM (string[1]))
140 1.1 christos string++;
141 1.1 christos
142 1.1 christos if (string[1] == '\0')
143 1.1 christos return 1;
144 1.1 christos else
145 1.1 christos return 0;
146 1.1 christos }
147 1.1 christos
148 1.1 christos /* Inspect the given RET_COMP for its type. If it is a typedef,
149 1.1 christos replace the node with the typedef's tree.
150 1.1 christos
151 1.1 christos Returns 1 if any typedef substitutions were made, 0 otherwise. */
152 1.1 christos
153 1.1 christos static int
154 1.1 christos inspect_type (struct demangle_parse_info *info,
155 1.1 christos struct demangle_component *ret_comp,
156 1.1 christos canonicalization_ftype *finder,
157 1.1 christos void *data)
158 1.1 christos {
159 1.1 christos int i;
160 1.1 christos char *name;
161 1.1 christos struct symbol *sym;
162 1.1 christos volatile struct gdb_exception except;
163 1.1 christos
164 1.1 christos /* Copy the symbol's name from RET_COMP and look it up
165 1.1 christos in the symbol table. */
166 1.1 christos name = (char *) alloca (ret_comp->u.s_name.len + 1);
167 1.1 christos memcpy (name, ret_comp->u.s_name.s, ret_comp->u.s_name.len);
168 1.1 christos name[ret_comp->u.s_name.len] = '\0';
169 1.1 christos
170 1.1 christos /* Ignore any typedefs that should not be substituted. */
171 1.1 christos for (i = 0; i < ARRAY_SIZE (ignore_typedefs); ++i)
172 1.1 christos {
173 1.1 christos if (strcmp (name, ignore_typedefs[i]) == 0)
174 1.1 christos return 0;
175 1.1 christos }
176 1.1 christos
177 1.1 christos sym = NULL;
178 1.1 christos TRY_CATCH (except, RETURN_MASK_ALL)
179 1.1 christos {
180 1.1 christos sym = lookup_symbol (name, 0, VAR_DOMAIN, 0);
181 1.1 christos }
182 1.1 christos
183 1.1 christos if (except.reason >= 0 && sym != NULL)
184 1.1 christos {
185 1.1 christos struct type *otype = SYMBOL_TYPE (sym);
186 1.1 christos
187 1.1 christos if (finder != NULL)
188 1.1 christos {
189 1.1 christos const char *new_name = (*finder) (otype, data);
190 1.1 christos
191 1.1 christos if (new_name != NULL)
192 1.1 christos {
193 1.1 christos ret_comp->u.s_name.s = new_name;
194 1.1 christos ret_comp->u.s_name.len = strlen (new_name);
195 1.1 christos return 1;
196 1.1 christos }
197 1.1 christos
198 1.1 christos return 0;
199 1.1 christos }
200 1.1 christos
201 1.1 christos /* If the type is a typedef or namespace alias, replace it. */
202 1.1 christos if (TYPE_CODE (otype) == TYPE_CODE_TYPEDEF
203 1.1 christos || TYPE_CODE (otype) == TYPE_CODE_NAMESPACE)
204 1.1 christos {
205 1.1 christos long len;
206 1.1 christos int is_anon;
207 1.1 christos struct type *type;
208 1.1 christos struct demangle_parse_info *i;
209 1.1 christos struct ui_file *buf;
210 1.1 christos
211 1.1 christos /* Get the real type of the typedef. */
212 1.1 christos type = check_typedef (otype);
213 1.1 christos
214 1.1 christos /* If the symbol is a namespace and its type name is no different
215 1.1 christos than the name we looked up, this symbol is not a namespace
216 1.1 christos alias and does not need to be substituted. */
217 1.1 christos if (TYPE_CODE (otype) == TYPE_CODE_NAMESPACE
218 1.1 christos && strcmp (TYPE_NAME (type), name) == 0)
219 1.1 christos return 0;
220 1.1 christos
221 1.1 christos is_anon = (TYPE_TAG_NAME (type) == NULL
222 1.1 christos && (TYPE_CODE (type) == TYPE_CODE_ENUM
223 1.1 christos || TYPE_CODE (type) == TYPE_CODE_STRUCT
224 1.1 christos || TYPE_CODE (type) == TYPE_CODE_UNION));
225 1.1 christos if (is_anon)
226 1.1 christos {
227 1.1 christos struct type *last = otype;
228 1.1 christos
229 1.1 christos /* Find the last typedef for the type. */
230 1.1 christos while (TYPE_TARGET_TYPE (last) != NULL
231 1.1 christos && (TYPE_CODE (TYPE_TARGET_TYPE (last))
232 1.1 christos == TYPE_CODE_TYPEDEF))
233 1.1 christos last = TYPE_TARGET_TYPE (last);
234 1.1 christos
235 1.1 christos /* If there is only one typedef for this anonymous type,
236 1.1 christos do not substitute it. */
237 1.1 christos if (type == otype)
238 1.1 christos return 0;
239 1.1 christos else
240 1.1 christos /* Use the last typedef seen as the type for this
241 1.1 christos anonymous type. */
242 1.1 christos type = last;
243 1.1 christos }
244 1.1 christos
245 1.1 christos buf = mem_fileopen ();
246 1.1 christos TRY_CATCH (except, RETURN_MASK_ERROR)
247 1.1 christos {
248 1.1 christos type_print (type, "", buf, -1);
249 1.1 christos }
250 1.1 christos
251 1.1 christos /* If type_print threw an exception, there is little point
252 1.1 christos in continuing, so just bow out gracefully. */
253 1.1 christos if (except.reason < 0)
254 1.1 christos {
255 1.1 christos ui_file_delete (buf);
256 1.1 christos return 0;
257 1.1 christos }
258 1.1 christos
259 1.1 christos name = ui_file_obsavestring (buf, &info->obstack, &len);
260 1.1 christos ui_file_delete (buf);
261 1.1 christos
262 1.1 christos /* Turn the result into a new tree. Note that this
263 1.1 christos tree will contain pointers into NAME, so NAME cannot
264 1.1 christos be free'd until all typedef conversion is done and
265 1.1 christos the final result is converted into a string. */
266 1.1 christos i = cp_demangled_name_to_comp (name, NULL);
267 1.1 christos if (i != NULL)
268 1.1 christos {
269 1.1 christos /* Merge the two trees. */
270 1.1 christos cp_merge_demangle_parse_infos (info, ret_comp, i);
271 1.1 christos
272 1.1 christos /* Replace any newly introduced typedefs -- but not
273 1.1 christos if the type is anonymous (that would lead to infinite
274 1.1 christos looping). */
275 1.1 christos if (!is_anon)
276 1.1 christos replace_typedefs (info, ret_comp, finder, data);
277 1.1 christos }
278 1.1 christos else
279 1.1 christos {
280 1.1 christos /* This shouldn't happen unless the type printer has
281 1.1 christos output something that the name parser cannot grok.
282 1.1 christos Nonetheless, an ounce of prevention...
283 1.1 christos
284 1.1 christos Canonicalize the name again, and store it in the
285 1.1 christos current node (RET_COMP). */
286 1.1 christos char *canon = cp_canonicalize_string_no_typedefs (name);
287 1.1 christos
288 1.1 christos if (canon != NULL)
289 1.1 christos {
290 1.1 christos /* Copy the canonicalization into the obstack and
291 1.1 christos free CANON. */
292 1.1 christos name = copy_string_to_obstack (&info->obstack, canon, &len);
293 1.1 christos xfree (canon);
294 1.1 christos }
295 1.1 christos
296 1.1 christos ret_comp->u.s_name.s = name;
297 1.1 christos ret_comp->u.s_name.len = len;
298 1.1 christos }
299 1.1 christos
300 1.1 christos return 1;
301 1.1 christos }
302 1.1 christos }
303 1.1 christos
304 1.1 christos return 0;
305 1.1 christos }
306 1.1 christos
307 1.1 christos /* Replace any typedefs appearing in the qualified name
308 1.1 christos (DEMANGLE_COMPONENT_QUAL_NAME) represented in RET_COMP for the name parse
309 1.1 christos given in INFO. */
310 1.1 christos
311 1.1 christos static void
312 1.1 christos replace_typedefs_qualified_name (struct demangle_parse_info *info,
313 1.1 christos struct demangle_component *ret_comp,
314 1.1 christos canonicalization_ftype *finder,
315 1.1 christos void *data)
316 1.1 christos {
317 1.1 christos long len;
318 1.1 christos char *name;
319 1.1 christos struct ui_file *buf = mem_fileopen ();
320 1.1 christos struct demangle_component *comp = ret_comp;
321 1.1 christos
322 1.1 christos /* Walk each node of the qualified name, reconstructing the name of
323 1.1 christos this element. With every node, check for any typedef substitutions.
324 1.1 christos If a substitution has occurred, replace the qualified name node
325 1.1 christos with a DEMANGLE_COMPONENT_NAME node representing the new, typedef-
326 1.1 christos substituted name. */
327 1.1 christos while (comp->type == DEMANGLE_COMPONENT_QUAL_NAME)
328 1.1 christos {
329 1.1 christos if (d_left (comp)->type == DEMANGLE_COMPONENT_NAME)
330 1.1 christos {
331 1.1 christos struct demangle_component new;
332 1.1 christos
333 1.1 christos ui_file_write (buf, d_left (comp)->u.s_name.s,
334 1.1 christos d_left (comp)->u.s_name.len);
335 1.1 christos name = ui_file_obsavestring (buf, &info->obstack, &len);
336 1.1 christos new.type = DEMANGLE_COMPONENT_NAME;
337 1.1 christos new.u.s_name.s = name;
338 1.1 christos new.u.s_name.len = len;
339 1.1 christos if (inspect_type (info, &new, finder, data))
340 1.1 christos {
341 1.1 christos char *n, *s;
342 1.1 christos long slen;
343 1.1 christos
344 1.1 christos /* A typedef was substituted in NEW. Convert it to a
345 1.1 christos string and replace the top DEMANGLE_COMPONENT_QUAL_NAME
346 1.1 christos node. */
347 1.1 christos
348 1.1 christos ui_file_rewind (buf);
349 1.1 christos n = cp_comp_to_string (&new, 100);
350 1.1 christos if (n == NULL)
351 1.1 christos {
352 1.1 christos /* If something went astray, abort typedef substitutions. */
353 1.1 christos ui_file_delete (buf);
354 1.1 christos return;
355 1.1 christos }
356 1.1 christos
357 1.1 christos s = copy_string_to_obstack (&info->obstack, n, &slen);
358 1.1 christos xfree (n);
359 1.1 christos
360 1.1 christos d_left (ret_comp)->type = DEMANGLE_COMPONENT_NAME;
361 1.1 christos d_left (ret_comp)->u.s_name.s = s;
362 1.1 christos d_left (ret_comp)->u.s_name.len = slen;
363 1.1 christos d_right (ret_comp) = d_right (comp);
364 1.1 christos comp = ret_comp;
365 1.1 christos continue;
366 1.1 christos }
367 1.1 christos }
368 1.1 christos else
369 1.1 christos {
370 1.1 christos /* The current node is not a name, so simply replace any
371 1.1 christos typedefs in it. Then print it to the stream to continue
372 1.1 christos checking for more typedefs in the tree. */
373 1.1 christos replace_typedefs (info, d_left (comp), finder, data);
374 1.1 christos name = cp_comp_to_string (d_left (comp), 100);
375 1.1 christos if (name == NULL)
376 1.1 christos {
377 1.1 christos /* If something went astray, abort typedef substitutions. */
378 1.1 christos ui_file_delete (buf);
379 1.1 christos return;
380 1.1 christos }
381 1.1 christos fputs_unfiltered (name, buf);
382 1.1 christos xfree (name);
383 1.1 christos }
384 1.1 christos
385 1.1 christos ui_file_write (buf, "::", 2);
386 1.1 christos comp = d_right (comp);
387 1.1 christos }
388 1.1 christos
389 1.1 christos /* If the next component is DEMANGLE_COMPONENT_NAME, save the qualified
390 1.1 christos name assembled above and append the name given by COMP. Then use this
391 1.1 christos reassembled name to check for a typedef. */
392 1.1 christos
393 1.1 christos if (comp->type == DEMANGLE_COMPONENT_NAME)
394 1.1 christos {
395 1.1 christos ui_file_write (buf, comp->u.s_name.s, comp->u.s_name.len);
396 1.1 christos name = ui_file_obsavestring (buf, &info->obstack, &len);
397 1.1 christos
398 1.1 christos /* Replace the top (DEMANGLE_COMPONENT_QUAL_NAME) node
399 1.1 christos with a DEMANGLE_COMPONENT_NAME node containing the whole
400 1.1 christos name. */
401 1.1 christos ret_comp->type = DEMANGLE_COMPONENT_NAME;
402 1.1 christos ret_comp->u.s_name.s = name;
403 1.1 christos ret_comp->u.s_name.len = len;
404 1.1 christos inspect_type (info, ret_comp, finder, data);
405 1.1 christos }
406 1.1 christos else
407 1.1 christos replace_typedefs (info, comp, finder, data);
408 1.1 christos
409 1.1 christos ui_file_delete (buf);
410 1.1 christos }
411 1.1 christos
412 1.1 christos
413 1.1 christos /* A function to check const and volatile qualifiers for argument types.
414 1.1 christos
415 1.1 christos "Parameter declarations that differ only in the presence
416 1.1 christos or absence of `const' and/or `volatile' are equivalent."
417 1.1 christos C++ Standard N3290, clause 13.1.3 #4. */
418 1.1 christos
419 1.1 christos static void
420 1.1 christos check_cv_qualifiers (struct demangle_component *ret_comp)
421 1.1 christos {
422 1.1 christos while (d_left (ret_comp) != NULL
423 1.1 christos && (d_left (ret_comp)->type == DEMANGLE_COMPONENT_CONST
424 1.1 christos || d_left (ret_comp)->type == DEMANGLE_COMPONENT_VOLATILE))
425 1.1 christos {
426 1.1 christos d_left (ret_comp) = d_left (d_left (ret_comp));
427 1.1 christos }
428 1.1 christos }
429 1.1 christos
430 1.1 christos /* Walk the parse tree given by RET_COMP, replacing any typedefs with
431 1.1 christos their basic types. */
432 1.1 christos
433 1.1 christos static void
434 1.1 christos replace_typedefs (struct demangle_parse_info *info,
435 1.1 christos struct demangle_component *ret_comp,
436 1.1 christos canonicalization_ftype *finder,
437 1.1 christos void *data)
438 1.1 christos {
439 1.1 christos if (ret_comp)
440 1.1 christos {
441 1.1 christos if (finder != NULL
442 1.1 christos && (ret_comp->type == DEMANGLE_COMPONENT_NAME
443 1.1 christos || ret_comp->type == DEMANGLE_COMPONENT_QUAL_NAME
444 1.1 christos || ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE
445 1.1 christos || ret_comp->type == DEMANGLE_COMPONENT_BUILTIN_TYPE))
446 1.1 christos {
447 1.1 christos char *local_name = cp_comp_to_string (ret_comp, 10);
448 1.1 christos
449 1.1 christos if (local_name != NULL)
450 1.1 christos {
451 1.1 christos struct symbol *sym;
452 1.1 christos volatile struct gdb_exception except;
453 1.1 christos
454 1.1 christos sym = NULL;
455 1.1 christos TRY_CATCH (except, RETURN_MASK_ALL)
456 1.1 christos {
457 1.1 christos sym = lookup_symbol (local_name, 0, VAR_DOMAIN, 0);
458 1.1 christos }
459 1.1 christos xfree (local_name);
460 1.1 christos
461 1.1 christos if (except.reason >= 0 && sym != NULL)
462 1.1 christos {
463 1.1 christos struct type *otype = SYMBOL_TYPE (sym);
464 1.1 christos const char *new_name = (*finder) (otype, data);
465 1.1 christos
466 1.1 christos if (new_name != NULL)
467 1.1 christos {
468 1.1 christos ret_comp->type = DEMANGLE_COMPONENT_NAME;
469 1.1 christos ret_comp->u.s_name.s = new_name;
470 1.1 christos ret_comp->u.s_name.len = strlen (new_name);
471 1.1 christos return;
472 1.1 christos }
473 1.1 christos }
474 1.1 christos }
475 1.1 christos }
476 1.1 christos
477 1.1 christos switch (ret_comp->type)
478 1.1 christos {
479 1.1 christos case DEMANGLE_COMPONENT_ARGLIST:
480 1.1 christos check_cv_qualifiers (ret_comp);
481 1.1 christos /* Fall through */
482 1.1 christos
483 1.1 christos case DEMANGLE_COMPONENT_FUNCTION_TYPE:
484 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
485 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
486 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
487 1.1 christos replace_typedefs (info, d_left (ret_comp), finder, data);
488 1.1 christos replace_typedefs (info, d_right (ret_comp), finder, data);
489 1.1 christos break;
490 1.1 christos
491 1.1 christos case DEMANGLE_COMPONENT_NAME:
492 1.1 christos inspect_type (info, ret_comp, finder, data);
493 1.1 christos break;
494 1.1 christos
495 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
496 1.1 christos replace_typedefs_qualified_name (info, ret_comp, finder, data);
497 1.1 christos break;
498 1.1 christos
499 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
500 1.1 christos case DEMANGLE_COMPONENT_CTOR:
501 1.1 christos case DEMANGLE_COMPONENT_ARRAY_TYPE:
502 1.1 christos case DEMANGLE_COMPONENT_PTRMEM_TYPE:
503 1.1 christos replace_typedefs (info, d_right (ret_comp), finder, data);
504 1.1 christos break;
505 1.1 christos
506 1.1 christos case DEMANGLE_COMPONENT_CONST:
507 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
508 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
509 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
510 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
511 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
512 1.1 christos case DEMANGLE_COMPONENT_POINTER:
513 1.1 christos case DEMANGLE_COMPONENT_REFERENCE:
514 1.1 christos replace_typedefs (info, d_left (ret_comp), finder, data);
515 1.1 christos break;
516 1.1 christos
517 1.1 christos default:
518 1.1 christos break;
519 1.1 christos }
520 1.1 christos }
521 1.1 christos }
522 1.1 christos
523 1.1 christos /* Parse STRING and convert it to canonical form, resolving any typedefs.
524 1.1 christos If parsing fails, or if STRING is already canonical, return NULL.
525 1.1 christos Otherwise return the canonical form. The return value is allocated via
526 1.1 christos xmalloc. If FINDER is not NULL, then type components are passed to
527 1.1 christos FINDER to be looked up. DATA is passed verbatim to FINDER. */
528 1.1 christos
529 1.1 christos char *
530 1.1 christos cp_canonicalize_string_full (const char *string,
531 1.1 christos canonicalization_ftype *finder,
532 1.1 christos void *data)
533 1.1 christos {
534 1.1 christos char *ret;
535 1.1 christos unsigned int estimated_len;
536 1.1 christos struct demangle_parse_info *info;
537 1.1 christos
538 1.1 christos ret = NULL;
539 1.1 christos estimated_len = strlen (string) * 2;
540 1.1 christos info = cp_demangled_name_to_comp (string, NULL);
541 1.1 christos if (info != NULL)
542 1.1 christos {
543 1.1 christos /* Replace all the typedefs in the tree. */
544 1.1 christos replace_typedefs (info, info->tree, finder, data);
545 1.1 christos
546 1.1 christos /* Convert the tree back into a string. */
547 1.1 christos ret = cp_comp_to_string (info->tree, estimated_len);
548 1.1 christos gdb_assert (ret != NULL);
549 1.1 christos
550 1.1 christos /* Free the parse information. */
551 1.1 christos cp_demangled_name_parse_free (info);
552 1.1 christos
553 1.1 christos /* Finally, compare the original string with the computed
554 1.1 christos name, returning NULL if they are the same. */
555 1.1 christos if (strcmp (string, ret) == 0)
556 1.1 christos {
557 1.1 christos xfree (ret);
558 1.1 christos return NULL;
559 1.1 christos }
560 1.1 christos }
561 1.1 christos
562 1.1 christos return ret;
563 1.1 christos }
564 1.1 christos
565 1.1 christos /* Like cp_canonicalize_string_full, but always passes NULL for
566 1.1 christos FINDER. */
567 1.1 christos
568 1.1 christos char *
569 1.1 christos cp_canonicalize_string_no_typedefs (const char *string)
570 1.1 christos {
571 1.1 christos return cp_canonicalize_string_full (string, NULL, NULL);
572 1.1 christos }
573 1.1 christos
574 1.1 christos /* Parse STRING and convert it to canonical form. If parsing fails,
575 1.1 christos or if STRING is already canonical, return NULL. Otherwise return
576 1.1 christos the canonical form. The return value is allocated via xmalloc. */
577 1.1 christos
578 1.1 christos char *
579 1.1 christos cp_canonicalize_string (const char *string)
580 1.1 christos {
581 1.1 christos struct demangle_parse_info *info;
582 1.1 christos unsigned int estimated_len;
583 1.1 christos char *ret;
584 1.1 christos
585 1.1 christos if (cp_already_canonical (string))
586 1.1 christos return NULL;
587 1.1 christos
588 1.1 christos info = cp_demangled_name_to_comp (string, NULL);
589 1.1 christos if (info == NULL)
590 1.1 christos return NULL;
591 1.1 christos
592 1.1 christos estimated_len = strlen (string) * 2;
593 1.1 christos ret = cp_comp_to_string (info->tree, estimated_len);
594 1.1 christos cp_demangled_name_parse_free (info);
595 1.1 christos
596 1.1 christos if (ret == NULL)
597 1.1 christos {
598 1.1 christos warning (_("internal error: string \"%s\" failed to be canonicalized"),
599 1.1 christos string);
600 1.1 christos return NULL;
601 1.1 christos }
602 1.1 christos
603 1.1 christos if (strcmp (string, ret) == 0)
604 1.1 christos {
605 1.1 christos xfree (ret);
606 1.1 christos return NULL;
607 1.1 christos }
608 1.1 christos
609 1.1 christos return ret;
610 1.1 christos }
611 1.1 christos
612 1.1 christos /* Convert a mangled name to a demangle_component tree. *MEMORY is
613 1.1 christos set to the block of used memory that should be freed when finished
614 1.1 christos with the tree. DEMANGLED_P is set to the char * that should be
615 1.1 christos freed when finished with the tree, or NULL if none was needed.
616 1.1 christos OPTIONS will be passed to the demangler. */
617 1.1 christos
618 1.1 christos static struct demangle_parse_info *
619 1.1 christos mangled_name_to_comp (const char *mangled_name, int options,
620 1.1 christos void **memory, char **demangled_p)
621 1.1 christos {
622 1.1 christos char *demangled_name;
623 1.1 christos struct demangle_parse_info *info;
624 1.1 christos
625 1.1 christos /* If it looks like a v3 mangled name, then try to go directly
626 1.1 christos to trees. */
627 1.1 christos if (mangled_name[0] == '_' && mangled_name[1] == 'Z')
628 1.1 christos {
629 1.1 christos struct demangle_component *ret;
630 1.1 christos
631 1.1 christos ret = cplus_demangle_v3_components (mangled_name,
632 1.1 christos options, memory);
633 1.1 christos if (ret)
634 1.1 christos {
635 1.1 christos info = cp_new_demangle_parse_info ();
636 1.1 christos info->tree = ret;
637 1.1 christos *demangled_p = NULL;
638 1.1 christos return info;
639 1.1 christos }
640 1.1 christos }
641 1.1 christos
642 1.1 christos /* If it doesn't, or if that failed, then try to demangle the
643 1.1 christos name. */
644 1.1 christos demangled_name = gdb_demangle (mangled_name, options);
645 1.1 christos if (demangled_name == NULL)
646 1.1 christos return NULL;
647 1.1 christos
648 1.1 christos /* If we could demangle the name, parse it to build the component
649 1.1 christos tree. */
650 1.1 christos info = cp_demangled_name_to_comp (demangled_name, NULL);
651 1.1 christos
652 1.1 christos if (info == NULL)
653 1.1 christos {
654 1.1 christos xfree (demangled_name);
655 1.1 christos return NULL;
656 1.1 christos }
657 1.1 christos
658 1.1 christos *demangled_p = demangled_name;
659 1.1 christos return info;
660 1.1 christos }
661 1.1 christos
662 1.1 christos /* Return the name of the class containing method PHYSNAME. */
663 1.1 christos
664 1.1 christos char *
665 1.1 christos cp_class_name_from_physname (const char *physname)
666 1.1 christos {
667 1.1 christos void *storage = NULL;
668 1.1 christos char *demangled_name = NULL, *ret;
669 1.1 christos struct demangle_component *ret_comp, *prev_comp, *cur_comp;
670 1.1 christos struct demangle_parse_info *info;
671 1.1 christos int done;
672 1.1 christos
673 1.1 christos info = mangled_name_to_comp (physname, DMGL_ANSI,
674 1.1 christos &storage, &demangled_name);
675 1.1 christos if (info == NULL)
676 1.1 christos return NULL;
677 1.1 christos
678 1.1 christos done = 0;
679 1.1 christos ret_comp = info->tree;
680 1.1 christos
681 1.1 christos /* First strip off any qualifiers, if we have a function or
682 1.1 christos method. */
683 1.1 christos while (!done)
684 1.1 christos switch (ret_comp->type)
685 1.1 christos {
686 1.1 christos case DEMANGLE_COMPONENT_CONST:
687 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
688 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
689 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
690 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
691 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
692 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
693 1.1 christos ret_comp = d_left (ret_comp);
694 1.1 christos break;
695 1.1 christos default:
696 1.1 christos done = 1;
697 1.1 christos break;
698 1.1 christos }
699 1.1 christos
700 1.1 christos /* If what we have now is a function, discard the argument list. */
701 1.1 christos if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME)
702 1.1 christos ret_comp = d_left (ret_comp);
703 1.1 christos
704 1.1 christos /* If what we have now is a template, strip off the template
705 1.1 christos arguments. The left subtree may be a qualified name. */
706 1.1 christos if (ret_comp->type == DEMANGLE_COMPONENT_TEMPLATE)
707 1.1 christos ret_comp = d_left (ret_comp);
708 1.1 christos
709 1.1 christos /* What we have now should be a name, possibly qualified.
710 1.1 christos Additional qualifiers could live in the left subtree or the right
711 1.1 christos subtree. Find the last piece. */
712 1.1 christos done = 0;
713 1.1 christos prev_comp = NULL;
714 1.1 christos cur_comp = ret_comp;
715 1.1 christos while (!done)
716 1.1 christos switch (cur_comp->type)
717 1.1 christos {
718 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
719 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
720 1.1 christos prev_comp = cur_comp;
721 1.1 christos cur_comp = d_right (cur_comp);
722 1.1 christos break;
723 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
724 1.1 christos case DEMANGLE_COMPONENT_NAME:
725 1.1 christos case DEMANGLE_COMPONENT_CTOR:
726 1.1 christos case DEMANGLE_COMPONENT_DTOR:
727 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
728 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
729 1.1 christos done = 1;
730 1.1 christos break;
731 1.1 christos default:
732 1.1 christos done = 1;
733 1.1 christos cur_comp = NULL;
734 1.1 christos break;
735 1.1 christos }
736 1.1 christos
737 1.1 christos ret = NULL;
738 1.1 christos if (cur_comp != NULL && prev_comp != NULL)
739 1.1 christos {
740 1.1 christos /* We want to discard the rightmost child of PREV_COMP. */
741 1.1 christos *prev_comp = *d_left (prev_comp);
742 1.1 christos /* The ten is completely arbitrary; we don't have a good
743 1.1 christos estimate. */
744 1.1 christos ret = cp_comp_to_string (ret_comp, 10);
745 1.1 christos }
746 1.1 christos
747 1.1 christos xfree (storage);
748 1.1 christos xfree (demangled_name);
749 1.1 christos cp_demangled_name_parse_free (info);
750 1.1 christos return ret;
751 1.1 christos }
752 1.1 christos
753 1.1 christos /* Return the child of COMP which is the basename of a method,
754 1.1 christos variable, et cetera. All scope qualifiers are discarded, but
755 1.1 christos template arguments will be included. The component tree may be
756 1.1 christos modified. */
757 1.1 christos
758 1.1 christos static struct demangle_component *
759 1.1 christos unqualified_name_from_comp (struct demangle_component *comp)
760 1.1 christos {
761 1.1 christos struct demangle_component *ret_comp = comp, *last_template;
762 1.1 christos int done;
763 1.1 christos
764 1.1 christos done = 0;
765 1.1 christos last_template = NULL;
766 1.1 christos while (!done)
767 1.1 christos switch (ret_comp->type)
768 1.1 christos {
769 1.1 christos case DEMANGLE_COMPONENT_QUAL_NAME:
770 1.1 christos case DEMANGLE_COMPONENT_LOCAL_NAME:
771 1.1 christos ret_comp = d_right (ret_comp);
772 1.1 christos break;
773 1.1 christos case DEMANGLE_COMPONENT_TYPED_NAME:
774 1.1 christos ret_comp = d_left (ret_comp);
775 1.1 christos break;
776 1.1 christos case DEMANGLE_COMPONENT_TEMPLATE:
777 1.1 christos gdb_assert (last_template == NULL);
778 1.1 christos last_template = ret_comp;
779 1.1 christos ret_comp = d_left (ret_comp);
780 1.1 christos break;
781 1.1 christos case DEMANGLE_COMPONENT_CONST:
782 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
783 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
784 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
785 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
786 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
787 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
788 1.1 christos ret_comp = d_left (ret_comp);
789 1.1 christos break;
790 1.1 christos case DEMANGLE_COMPONENT_NAME:
791 1.1 christos case DEMANGLE_COMPONENT_CTOR:
792 1.1 christos case DEMANGLE_COMPONENT_DTOR:
793 1.1 christos case DEMANGLE_COMPONENT_OPERATOR:
794 1.1 christos case DEMANGLE_COMPONENT_EXTENDED_OPERATOR:
795 1.1 christos done = 1;
796 1.1 christos break;
797 1.1 christos default:
798 1.1 christos return NULL;
799 1.1 christos break;
800 1.1 christos }
801 1.1 christos
802 1.1 christos if (last_template)
803 1.1 christos {
804 1.1 christos d_left (last_template) = ret_comp;
805 1.1 christos return last_template;
806 1.1 christos }
807 1.1 christos
808 1.1 christos return ret_comp;
809 1.1 christos }
810 1.1 christos
811 1.1 christos /* Return the name of the method whose linkage name is PHYSNAME. */
812 1.1 christos
813 1.1 christos char *
814 1.1 christos method_name_from_physname (const char *physname)
815 1.1 christos {
816 1.1 christos void *storage = NULL;
817 1.1 christos char *demangled_name = NULL, *ret;
818 1.1 christos struct demangle_component *ret_comp;
819 1.1 christos struct demangle_parse_info *info;
820 1.1 christos
821 1.1 christos info = mangled_name_to_comp (physname, DMGL_ANSI,
822 1.1 christos &storage, &demangled_name);
823 1.1 christos if (info == NULL)
824 1.1 christos return NULL;
825 1.1 christos
826 1.1 christos ret_comp = unqualified_name_from_comp (info->tree);
827 1.1 christos
828 1.1 christos ret = NULL;
829 1.1 christos if (ret_comp != NULL)
830 1.1 christos /* The ten is completely arbitrary; we don't have a good
831 1.1 christos estimate. */
832 1.1 christos ret = cp_comp_to_string (ret_comp, 10);
833 1.1 christos
834 1.1 christos xfree (storage);
835 1.1 christos xfree (demangled_name);
836 1.1 christos cp_demangled_name_parse_free (info);
837 1.1 christos return ret;
838 1.1 christos }
839 1.1 christos
840 1.1 christos /* If FULL_NAME is the demangled name of a C++ function (including an
841 1.1 christos arg list, possibly including namespace/class qualifications),
842 1.1 christos return a new string containing only the function name (without the
843 1.1 christos arg list/class qualifications). Otherwise, return NULL. The
844 1.1 christos caller is responsible for freeing the memory in question. */
845 1.1 christos
846 1.1 christos char *
847 1.1 christos cp_func_name (const char *full_name)
848 1.1 christos {
849 1.1 christos char *ret;
850 1.1 christos struct demangle_component *ret_comp;
851 1.1 christos struct demangle_parse_info *info;
852 1.1 christos
853 1.1 christos info = cp_demangled_name_to_comp (full_name, NULL);
854 1.1 christos if (!info)
855 1.1 christos return NULL;
856 1.1 christos
857 1.1 christos ret_comp = unqualified_name_from_comp (info->tree);
858 1.1 christos
859 1.1 christos ret = NULL;
860 1.1 christos if (ret_comp != NULL)
861 1.1 christos ret = cp_comp_to_string (ret_comp, 10);
862 1.1 christos
863 1.1 christos cp_demangled_name_parse_free (info);
864 1.1 christos return ret;
865 1.1 christos }
866 1.1 christos
867 1.1 christos /* DEMANGLED_NAME is the name of a function, including parameters and
868 1.1 christos (optionally) a return type. Return the name of the function without
869 1.1 christos parameters or return type, or NULL if we can not parse the name. */
870 1.1 christos
871 1.1 christos char *
872 1.1 christos cp_remove_params (const char *demangled_name)
873 1.1 christos {
874 1.1 christos int done = 0;
875 1.1 christos struct demangle_component *ret_comp;
876 1.1 christos struct demangle_parse_info *info;
877 1.1 christos char *ret = NULL;
878 1.1 christos
879 1.1 christos if (demangled_name == NULL)
880 1.1 christos return NULL;
881 1.1 christos
882 1.1 christos info = cp_demangled_name_to_comp (demangled_name, NULL);
883 1.1 christos if (info == NULL)
884 1.1 christos return NULL;
885 1.1 christos
886 1.1 christos /* First strip off any qualifiers, if we have a function or method. */
887 1.1 christos ret_comp = info->tree;
888 1.1 christos while (!done)
889 1.1 christos switch (ret_comp->type)
890 1.1 christos {
891 1.1 christos case DEMANGLE_COMPONENT_CONST:
892 1.1 christos case DEMANGLE_COMPONENT_RESTRICT:
893 1.1 christos case DEMANGLE_COMPONENT_VOLATILE:
894 1.1 christos case DEMANGLE_COMPONENT_CONST_THIS:
895 1.1 christos case DEMANGLE_COMPONENT_RESTRICT_THIS:
896 1.1 christos case DEMANGLE_COMPONENT_VOLATILE_THIS:
897 1.1 christos case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
898 1.1 christos ret_comp = d_left (ret_comp);
899 1.1 christos break;
900 1.1 christos default:
901 1.1 christos done = 1;
902 1.1 christos break;
903 1.1 christos }
904 1.1 christos
905 1.1 christos /* What we have now should be a function. Return its name. */
906 1.1 christos if (ret_comp->type == DEMANGLE_COMPONENT_TYPED_NAME)
907 1.1 christos ret = cp_comp_to_string (d_left (ret_comp), 10);
908 1.1 christos
909 1.1 christos cp_demangled_name_parse_free (info);
910 1.1 christos return ret;
911 1.1 christos }
912 1.1 christos
913 1.1 christos /* Here are some random pieces of trivia to keep in mind while trying
914 1.1 christos to take apart demangled names:
915 1.1 christos
916 1.1 christos - Names can contain function arguments or templates, so the process
917 1.1 christos has to be, to some extent recursive: maybe keep track of your
918 1.1 christos depth based on encountering <> and ().
919 1.1 christos
920 1.1 christos - Parentheses don't just have to happen at the end of a name: they
921 1.1 christos can occur even if the name in question isn't a function, because
922 1.1 christos a template argument might be a type that's a function.
923 1.1 christos
924 1.1 christos - Conversely, even if you're trying to deal with a function, its
925 1.1 christos demangled name might not end with ')': it could be a const or
926 1.1 christos volatile class method, in which case it ends with "const" or
927 1.1 christos "volatile".
928 1.1 christos
929 1.1 christos - Parentheses are also used in anonymous namespaces: a variable
930 1.1 christos 'foo' in an anonymous namespace gets demangled as "(anonymous
931 1.1 christos namespace)::foo".
932 1.1 christos
933 1.1 christos - And operator names can contain parentheses or angle brackets. */
934 1.1 christos
935 1.1 christos /* FIXME: carlton/2003-03-13: We have several functions here with
936 1.1 christos overlapping functionality; can we combine them? Also, do they
937 1.1 christos handle all the above considerations correctly? */
938 1.1 christos
939 1.1 christos
940 1.1 christos /* This returns the length of first component of NAME, which should be
941 1.1 christos the demangled name of a C++ variable/function/method/etc.
942 1.1 christos Specifically, it returns the index of the first colon forming the
943 1.1 christos boundary of the first component: so, given 'A::foo' or 'A::B::foo'
944 1.1 christos it returns the 1, and given 'foo', it returns 0. */
945 1.1 christos
946 1.1 christos /* The character in NAME indexed by the return value is guaranteed to
947 1.1 christos always be either ':' or '\0'. */
948 1.1 christos
949 1.1 christos /* NOTE: carlton/2003-03-13: This function is currently only intended
950 1.1 christos for internal use: it's probably not entirely safe when called on
951 1.1 christos user-generated input, because some of the 'index += 2' lines in
952 1.1 christos cp_find_first_component_aux might go past the end of malformed
953 1.1 christos input. */
954 1.1 christos
955 1.1 christos unsigned int
956 1.1 christos cp_find_first_component (const char *name)
957 1.1 christos {
958 1.1 christos return cp_find_first_component_aux (name, 0);
959 1.1 christos }
960 1.1 christos
961 1.1 christos /* Helper function for cp_find_first_component. Like that function,
962 1.1 christos it returns the length of the first component of NAME, but to make
963 1.1 christos the recursion easier, it also stops if it reaches an unexpected ')'
964 1.1 christos or '>' if the value of PERMISSIVE is nonzero. */
965 1.1 christos
966 1.1 christos /* Let's optimize away calls to strlen("operator"). */
967 1.1 christos
968 1.1 christos #define LENGTH_OF_OPERATOR 8
969 1.1 christos
970 1.1 christos static unsigned int
971 1.1 christos cp_find_first_component_aux (const char *name, int permissive)
972 1.1 christos {
973 1.1 christos unsigned int index = 0;
974 1.1 christos /* Operator names can show up in unexpected places. Since these can
975 1.1 christos contain parentheses or angle brackets, they can screw up the
976 1.1 christos recursion. But not every string 'operator' is part of an
977 1.1 christos operater name: e.g. you could have a variable 'cooperator'. So
978 1.1 christos this variable tells us whether or not we should treat the string
979 1.1 christos 'operator' as starting an operator. */
980 1.1 christos int operator_possible = 1;
981 1.1 christos
982 1.1 christos for (;; ++index)
983 1.1 christos {
984 1.1 christos switch (name[index])
985 1.1 christos {
986 1.1 christos case '<':
987 1.1 christos /* Template; eat it up. The calls to cp_first_component
988 1.1 christos should only return (I hope!) when they reach the '>'
989 1.1 christos terminating the component or a '::' between two
990 1.1 christos components. (Hence the '+ 2'.) */
991 1.1 christos index += 1;
992 1.1 christos for (index += cp_find_first_component_aux (name + index, 1);
993 1.1 christos name[index] != '>';
994 1.1 christos index += cp_find_first_component_aux (name + index, 1))
995 1.1 christos {
996 1.1 christos if (name[index] != ':')
997 1.1 christos {
998 1.1 christos demangled_name_complaint (name);
999 1.1 christos return strlen (name);
1000 1.1 christos }
1001 1.1 christos index += 2;
1002 1.1 christos }
1003 1.1 christos operator_possible = 1;
1004 1.1 christos break;
1005 1.1 christos case '(':
1006 1.1 christos /* Similar comment as to '<'. */
1007 1.1 christos index += 1;
1008 1.1 christos for (index += cp_find_first_component_aux (name + index, 1);
1009 1.1 christos name[index] != ')';
1010 1.1 christos index += cp_find_first_component_aux (name + index, 1))
1011 1.1 christos {
1012 1.1 christos if (name[index] != ':')
1013 1.1 christos {
1014 1.1 christos demangled_name_complaint (name);
1015 1.1 christos return strlen (name);
1016 1.1 christos }
1017 1.1 christos index += 2;
1018 1.1 christos }
1019 1.1 christos operator_possible = 1;
1020 1.1 christos break;
1021 1.1 christos case '>':
1022 1.1 christos case ')':
1023 1.1 christos if (permissive)
1024 1.1 christos return index;
1025 1.1 christos else
1026 1.1 christos {
1027 1.1 christos demangled_name_complaint (name);
1028 1.1 christos return strlen (name);
1029 1.1 christos }
1030 1.1 christos case '\0':
1031 1.1 christos case ':':
1032 1.1 christos return index;
1033 1.1 christos case 'o':
1034 1.1 christos /* Operator names can screw up the recursion. */
1035 1.1 christos if (operator_possible
1036 1.1 christos && strncmp (name + index, "operator",
1037 1.1 christos LENGTH_OF_OPERATOR) == 0)
1038 1.1 christos {
1039 1.1 christos index += LENGTH_OF_OPERATOR;
1040 1.1 christos while (ISSPACE(name[index]))
1041 1.1 christos ++index;
1042 1.1 christos switch (name[index])
1043 1.1 christos {
1044 1.1 christos /* Skip over one less than the appropriate number of
1045 1.1 christos characters: the for loop will skip over the last
1046 1.1 christos one. */
1047 1.1 christos case '<':
1048 1.1 christos if (name[index + 1] == '<')
1049 1.1 christos index += 1;
1050 1.1 christos else
1051 1.1 christos index += 0;
1052 1.1 christos break;
1053 1.1 christos case '>':
1054 1.1 christos case '-':
1055 1.1 christos if (name[index + 1] == '>')
1056 1.1 christos index += 1;
1057 1.1 christos else
1058 1.1 christos index += 0;
1059 1.1 christos break;
1060 1.1 christos case '(':
1061 1.1 christos index += 1;
1062 1.1 christos break;
1063 1.1 christos default:
1064 1.1 christos index += 0;
1065 1.1 christos break;
1066 1.1 christos }
1067 1.1 christos }
1068 1.1 christos operator_possible = 0;
1069 1.1 christos break;
1070 1.1 christos case ' ':
1071 1.1 christos case ',':
1072 1.1 christos case '.':
1073 1.1 christos case '&':
1074 1.1 christos case '*':
1075 1.1 christos /* NOTE: carlton/2003-04-18: I'm not sure what the precise
1076 1.1 christos set of relevant characters are here: it's necessary to
1077 1.1 christos include any character that can show up before 'operator'
1078 1.1 christos in a demangled name, and it's safe to include any
1079 1.1 christos character that can't be part of an identifier's name. */
1080 1.1 christos operator_possible = 1;
1081 1.1 christos break;
1082 1.1 christos default:
1083 1.1 christos operator_possible = 0;
1084 1.1 christos break;
1085 1.1 christos }
1086 1.1 christos }
1087 1.1 christos }
1088 1.1 christos
1089 1.1 christos /* Complain about a demangled name that we don't know how to parse.
1090 1.1 christos NAME is the demangled name in question. */
1091 1.1 christos
1092 1.1 christos static void
1093 1.1 christos demangled_name_complaint (const char *name)
1094 1.1 christos {
1095 1.1 christos complaint (&symfile_complaints,
1096 1.1 christos "unexpected demangled name '%s'", name);
1097 1.1 christos }
1098 1.1 christos
1099 1.1 christos /* If NAME is the fully-qualified name of a C++
1100 1.1 christos function/variable/method/etc., this returns the length of its
1101 1.1 christos entire prefix: all of the namespaces and classes that make up its
1102 1.1 christos name. Given 'A::foo', it returns 1, given 'A::B::foo', it returns
1103 1.1 christos 4, given 'foo', it returns 0. */
1104 1.1 christos
1105 1.1 christos unsigned int
1106 1.1 christos cp_entire_prefix_len (const char *name)
1107 1.1 christos {
1108 1.1 christos unsigned int current_len = cp_find_first_component (name);
1109 1.1 christos unsigned int previous_len = 0;
1110 1.1 christos
1111 1.1 christos while (name[current_len] != '\0')
1112 1.1 christos {
1113 1.1 christos gdb_assert (name[current_len] == ':');
1114 1.1 christos previous_len = current_len;
1115 1.1 christos /* Skip the '::'. */
1116 1.1 christos current_len += 2;
1117 1.1 christos current_len += cp_find_first_component (name + current_len);
1118 1.1 christos }
1119 1.1 christos
1120 1.1 christos return previous_len;
1121 1.1 christos }
1122 1.1 christos
1123 1.1 christos /* Overload resolution functions. */
1124 1.1 christos
1125 1.1 christos /* Test to see if SYM is a symbol that we haven't seen corresponding
1126 1.1 christos to a function named OLOAD_NAME. If so, add it to the current
1127 1.1 christos completion list. */
1128 1.1 christos
1129 1.1 christos static void
1130 1.1 christos overload_list_add_symbol (struct symbol *sym,
1131 1.1 christos const char *oload_name)
1132 1.1 christos {
1133 1.1 christos int newsize;
1134 1.1 christos int i;
1135 1.1 christos char *sym_name;
1136 1.1 christos
1137 1.1 christos /* If there is no type information, we can't do anything, so
1138 1.1 christos skip. */
1139 1.1 christos if (SYMBOL_TYPE (sym) == NULL)
1140 1.1 christos return;
1141 1.1 christos
1142 1.1 christos /* skip any symbols that we've already considered. */
1143 1.1 christos for (i = 0; i < sym_return_val_index; ++i)
1144 1.1 christos if (strcmp (SYMBOL_LINKAGE_NAME (sym),
1145 1.1 christos SYMBOL_LINKAGE_NAME (sym_return_val[i])) == 0)
1146 1.1 christos return;
1147 1.1 christos
1148 1.1 christos /* Get the demangled name without parameters */
1149 1.1 christos sym_name = cp_remove_params (SYMBOL_NATURAL_NAME (sym));
1150 1.1 christos if (!sym_name)
1151 1.1 christos return;
1152 1.1 christos
1153 1.1 christos /* skip symbols that cannot match */
1154 1.1 christos if (strcmp (sym_name, oload_name) != 0)
1155 1.1 christos {
1156 1.1 christos xfree (sym_name);
1157 1.1 christos return;
1158 1.1 christos }
1159 1.1 christos
1160 1.1 christos xfree (sym_name);
1161 1.1 christos
1162 1.1 christos /* We have a match for an overload instance, so add SYM to the
1163 1.1 christos current list of overload instances */
1164 1.1 christos if (sym_return_val_index + 3 > sym_return_val_size)
1165 1.1 christos {
1166 1.1 christos newsize = (sym_return_val_size *= 2) * sizeof (struct symbol *);
1167 1.1 christos sym_return_val = (struct symbol **)
1168 1.1 christos xrealloc ((char *) sym_return_val, newsize);
1169 1.1 christos }
1170 1.1 christos sym_return_val[sym_return_val_index++] = sym;
1171 1.1 christos sym_return_val[sym_return_val_index] = NULL;
1172 1.1 christos }
1173 1.1 christos
1174 1.1 christos /* Return a null-terminated list of pointers to function symbols that
1175 1.1 christos are named FUNC_NAME and are visible within NAMESPACE. */
1176 1.1 christos
1177 1.1 christos struct symbol **
1178 1.1 christos make_symbol_overload_list (const char *func_name,
1179 1.1 christos const char *namespace)
1180 1.1 christos {
1181 1.1 christos struct cleanup *old_cleanups;
1182 1.1 christos const char *name;
1183 1.1 christos
1184 1.1 christos sym_return_val_size = 100;
1185 1.1 christos sym_return_val_index = 0;
1186 1.1 christos sym_return_val = xmalloc ((sym_return_val_size + 1) *
1187 1.1 christos sizeof (struct symbol *));
1188 1.1 christos sym_return_val[0] = NULL;
1189 1.1 christos
1190 1.1 christos old_cleanups = make_cleanup (xfree, sym_return_val);
1191 1.1 christos
1192 1.1 christos make_symbol_overload_list_using (func_name, namespace);
1193 1.1 christos
1194 1.1 christos if (namespace[0] == '\0')
1195 1.1 christos name = func_name;
1196 1.1 christos else
1197 1.1 christos {
1198 1.1 christos char *concatenated_name
1199 1.1 christos = alloca (strlen (namespace) + 2 + strlen (func_name) + 1);
1200 1.1 christos strcpy (concatenated_name, namespace);
1201 1.1 christos strcat (concatenated_name, "::");
1202 1.1 christos strcat (concatenated_name, func_name);
1203 1.1 christos name = concatenated_name;
1204 1.1 christos }
1205 1.1 christos
1206 1.1 christos make_symbol_overload_list_qualified (name);
1207 1.1 christos
1208 1.1 christos discard_cleanups (old_cleanups);
1209 1.1 christos
1210 1.1 christos return sym_return_val;
1211 1.1 christos }
1212 1.1 christos
1213 1.1 christos /* Add all symbols with a name matching NAME in BLOCK to the overload
1214 1.1 christos list. */
1215 1.1 christos
1216 1.1 christos static void
1217 1.1 christos make_symbol_overload_list_block (const char *name,
1218 1.1 christos const struct block *block)
1219 1.1 christos {
1220 1.1 christos struct block_iterator iter;
1221 1.1 christos struct symbol *sym;
1222 1.1 christos
1223 1.1 christos for (sym = block_iter_name_first (block, name, &iter);
1224 1.1 christos sym != NULL;
1225 1.1 christos sym = block_iter_name_next (name, &iter))
1226 1.1 christos overload_list_add_symbol (sym, name);
1227 1.1 christos }
1228 1.1 christos
1229 1.1 christos /* Adds the function FUNC_NAME from NAMESPACE to the overload set. */
1230 1.1 christos
1231 1.1 christos static void
1232 1.1 christos make_symbol_overload_list_namespace (const char *func_name,
1233 1.1 christos const char *namespace)
1234 1.1 christos {
1235 1.1 christos const char *name;
1236 1.1 christos const struct block *block = NULL;
1237 1.1 christos
1238 1.1 christos if (namespace[0] == '\0')
1239 1.1 christos name = func_name;
1240 1.1 christos else
1241 1.1 christos {
1242 1.1 christos char *concatenated_name
1243 1.1 christos = alloca (strlen (namespace) + 2 + strlen (func_name) + 1);
1244 1.1 christos
1245 1.1 christos strcpy (concatenated_name, namespace);
1246 1.1 christos strcat (concatenated_name, "::");
1247 1.1 christos strcat (concatenated_name, func_name);
1248 1.1 christos name = concatenated_name;
1249 1.1 christos }
1250 1.1 christos
1251 1.1 christos /* Look in the static block. */
1252 1.1 christos block = block_static_block (get_selected_block (0));
1253 1.1 christos if (block)
1254 1.1 christos make_symbol_overload_list_block (name, block);
1255 1.1 christos
1256 1.1 christos /* Look in the global block. */
1257 1.1 christos block = block_global_block (block);
1258 1.1 christos if (block)
1259 1.1 christos make_symbol_overload_list_block (name, block);
1260 1.1 christos
1261 1.1 christos }
1262 1.1 christos
1263 1.1 christos /* Search the namespace of the given type and namespace of and public
1264 1.1 christos base types. */
1265 1.1 christos
1266 1.1 christos static void
1267 1.1 christos make_symbol_overload_list_adl_namespace (struct type *type,
1268 1.1 christos const char *func_name)
1269 1.1 christos {
1270 1.1 christos char *namespace;
1271 1.1 christos const char *type_name;
1272 1.1 christos int i, prefix_len;
1273 1.1 christos
1274 1.1 christos while (TYPE_CODE (type) == TYPE_CODE_PTR
1275 1.1 christos || TYPE_CODE (type) == TYPE_CODE_REF
1276 1.1 christos || TYPE_CODE (type) == TYPE_CODE_ARRAY
1277 1.1 christos || TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
1278 1.1 christos {
1279 1.1 christos if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
1280 1.1 christos type = check_typedef(type);
1281 1.1 christos else
1282 1.1 christos type = TYPE_TARGET_TYPE (type);
1283 1.1 christos }
1284 1.1 christos
1285 1.1 christos type_name = TYPE_NAME (type);
1286 1.1 christos
1287 1.1 christos if (type_name == NULL)
1288 1.1 christos return;
1289 1.1 christos
1290 1.1 christos prefix_len = cp_entire_prefix_len (type_name);
1291 1.1 christos
1292 1.1 christos if (prefix_len != 0)
1293 1.1 christos {
1294 1.1 christos namespace = alloca (prefix_len + 1);
1295 1.1 christos strncpy (namespace, type_name, prefix_len);
1296 1.1 christos namespace[prefix_len] = '\0';
1297 1.1 christos
1298 1.1 christos make_symbol_overload_list_namespace (func_name, namespace);
1299 1.1 christos }
1300 1.1 christos
1301 1.1 christos /* Check public base type */
1302 1.1 christos if (TYPE_CODE (type) == TYPE_CODE_CLASS)
1303 1.1 christos for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
1304 1.1 christos {
1305 1.1 christos if (BASETYPE_VIA_PUBLIC (type, i))
1306 1.1 christos make_symbol_overload_list_adl_namespace (TYPE_BASECLASS (type,
1307 1.1 christos i),
1308 1.1 christos func_name);
1309 1.1 christos }
1310 1.1 christos }
1311 1.1 christos
1312 1.1 christos /* Adds the overload list overload candidates for FUNC_NAME found
1313 1.1 christos through argument dependent lookup. */
1314 1.1 christos
1315 1.1 christos struct symbol **
1316 1.1 christos make_symbol_overload_list_adl (struct type **arg_types, int nargs,
1317 1.1 christos const char *func_name)
1318 1.1 christos {
1319 1.1 christos int i;
1320 1.1 christos
1321 1.1 christos gdb_assert (sym_return_val_size != -1);
1322 1.1 christos
1323 1.1 christos for (i = 1; i <= nargs; i++)
1324 1.1 christos make_symbol_overload_list_adl_namespace (arg_types[i - 1],
1325 1.1 christos func_name);
1326 1.1 christos
1327 1.1 christos return sym_return_val;
1328 1.1 christos }
1329 1.1 christos
1330 1.1 christos /* Used for cleanups to reset the "searched" flag in case of an
1331 1.1 christos error. */
1332 1.1 christos
1333 1.1 christos static void
1334 1.1 christos reset_directive_searched (void *data)
1335 1.1 christos {
1336 1.1 christos struct using_direct *direct = data;
1337 1.1 christos direct->searched = 0;
1338 1.1 christos }
1339 1.1 christos
1340 1.1 christos /* This applies the using directives to add namespaces to search in,
1341 1.1 christos and then searches for overloads in all of those namespaces. It
1342 1.1 christos adds the symbols found to sym_return_val. Arguments are as in
1343 1.1 christos make_symbol_overload_list. */
1344 1.1 christos
1345 1.1 christos static void
1346 1.1 christos make_symbol_overload_list_using (const char *func_name,
1347 1.1 christos const char *namespace)
1348 1.1 christos {
1349 1.1 christos struct using_direct *current;
1350 1.1 christos const struct block *block;
1351 1.1 christos
1352 1.1 christos /* First, go through the using directives. If any of them apply,
1353 1.1 christos look in the appropriate namespaces for new functions to match
1354 1.1 christos on. */
1355 1.1 christos
1356 1.1 christos for (block = get_selected_block (0);
1357 1.1 christos block != NULL;
1358 1.1 christos block = BLOCK_SUPERBLOCK (block))
1359 1.1 christos for (current = block_using (block);
1360 1.1 christos current != NULL;
1361 1.1 christos current = current->next)
1362 1.1 christos {
1363 1.1 christos /* Prevent recursive calls. */
1364 1.1 christos if (current->searched)
1365 1.1 christos continue;
1366 1.1 christos
1367 1.1 christos /* If this is a namespace alias or imported declaration ignore
1368 1.1 christos it. */
1369 1.1 christos if (current->alias != NULL || current->declaration != NULL)
1370 1.1 christos continue;
1371 1.1 christos
1372 1.1 christos if (strcmp (namespace, current->import_dest) == 0)
1373 1.1 christos {
1374 1.1 christos /* Mark this import as searched so that the recursive call
1375 1.1 christos does not search it again. */
1376 1.1 christos struct cleanup *old_chain;
1377 1.1 christos current->searched = 1;
1378 1.1 christos old_chain = make_cleanup (reset_directive_searched,
1379 1.1 christos current);
1380 1.1 christos
1381 1.1 christos make_symbol_overload_list_using (func_name,
1382 1.1 christos current->import_src);
1383 1.1 christos
1384 1.1 christos current->searched = 0;
1385 1.1 christos discard_cleanups (old_chain);
1386 1.1 christos }
1387 1.1 christos }
1388 1.1 christos
1389 1.1 christos /* Now, add names for this namespace. */
1390 1.1 christos make_symbol_overload_list_namespace (func_name, namespace);
1391 1.1 christos }
1392 1.1 christos
1393 1.1 christos /* This does the bulk of the work of finding overloaded symbols.
1394 1.1 christos FUNC_NAME is the name of the overloaded function we're looking for
1395 1.1 christos (possibly including namespace info). */
1396 1.1 christos
1397 1.1 christos static void
1398 1.1 christos make_symbol_overload_list_qualified (const char *func_name)
1399 1.1 christos {
1400 1.1 christos struct symtab *s;
1401 1.1 christos struct objfile *objfile;
1402 1.1 christos const struct block *b, *surrounding_static_block = 0;
1403 1.1 christos
1404 1.1 christos /* Look through the partial symtabs for all symbols which begin by
1405 1.1 christos matching FUNC_NAME. Make sure we read that symbol table in. */
1406 1.1 christos
1407 1.1 christos ALL_OBJFILES (objfile)
1408 1.1 christos {
1409 1.1 christos if (objfile->sf)
1410 1.1 christos objfile->sf->qf->expand_symtabs_for_function (objfile, func_name);
1411 1.1 christos }
1412 1.1 christos
1413 1.1 christos /* Search upwards from currently selected frame (so that we can
1414 1.1 christos complete on local vars. */
1415 1.1 christos
1416 1.1 christos for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b))
1417 1.1 christos make_symbol_overload_list_block (func_name, b);
1418 1.1 christos
1419 1.1 christos surrounding_static_block = block_static_block (get_selected_block (0));
1420 1.1 christos
1421 1.1 christos /* Go through the symtabs and check the externs and statics for
1422 1.1 christos symbols which match. */
1423 1.1 christos
1424 1.1 christos ALL_PRIMARY_SYMTABS (objfile, s)
1425 1.1 christos {
1426 1.1 christos QUIT;
1427 1.1 christos b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
1428 1.1 christos make_symbol_overload_list_block (func_name, b);
1429 1.1 christos }
1430 1.1 christos
1431 1.1 christos ALL_PRIMARY_SYMTABS (objfile, s)
1432 1.1 christos {
1433 1.1 christos QUIT;
1434 1.1 christos b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1435 1.1 christos /* Don't do this block twice. */
1436 1.1 christos if (b == surrounding_static_block)
1437 1.1 christos continue;
1438 1.1 christos make_symbol_overload_list_block (func_name, b);
1439 1.1 christos }
1440 1.1 christos }
1441 1.1 christos
1442 1.1 christos /* Lookup the rtti type for a class name. */
1443 1.1 christos
1444 1.1 christos struct type *
1445 1.1 christos cp_lookup_rtti_type (const char *name, struct block *block)
1446 1.1 christos {
1447 1.1 christos struct symbol * rtti_sym;
1448 1.1 christos struct type * rtti_type;
1449 1.1 christos
1450 1.1 christos rtti_sym = lookup_symbol (name, block, STRUCT_DOMAIN, NULL);
1451 1.1 christos
1452 1.1 christos if (rtti_sym == NULL)
1453 1.1 christos {
1454 1.1 christos warning (_("RTTI symbol not found for class '%s'"), name);
1455 1.1 christos return NULL;
1456 1.1 christos }
1457 1.1 christos
1458 1.1 christos if (SYMBOL_CLASS (rtti_sym) != LOC_TYPEDEF)
1459 1.1 christos {
1460 1.1 christos warning (_("RTTI symbol for class '%s' is not a type"), name);
1461 1.1 christos return NULL;
1462 1.1 christos }
1463 1.1 christos
1464 1.1 christos rtti_type = SYMBOL_TYPE (rtti_sym);
1465 1.1 christos
1466 1.1 christos switch (TYPE_CODE (rtti_type))
1467 1.1 christos {
1468 1.1 christos case TYPE_CODE_CLASS:
1469 1.1 christos break;
1470 1.1 christos case TYPE_CODE_NAMESPACE:
1471 1.1 christos /* chastain/2003-11-26: the symbol tables often contain fake
1472 1.1 christos symbols for namespaces with the same name as the struct.
1473 1.1 christos This warning is an indication of a bug in the lookup order
1474 1.1 christos or a bug in the way that the symbol tables are populated. */
1475 1.1 christos warning (_("RTTI symbol for class '%s' is a namespace"), name);
1476 1.1 christos return NULL;
1477 1.1 christos default:
1478 1.1 christos warning (_("RTTI symbol for class '%s' has bad type"), name);
1479 1.1 christos return NULL;
1480 1.1 christos }
1481 1.1 christos
1482 1.1 christos return rtti_type;
1483 1.1 christos }
1484 1.1 christos
1485 1.1 christos /* A wrapper for bfd_demangle. */
1486 1.1 christos
1487 1.1 christos char *
1488 1.1 christos gdb_demangle (const char *name, int options)
1489 1.1 christos {
1490 1.1 christos return bfd_demangle (NULL, name, options);
1491 1.1 christos }
1492 1.1 christos
1493 1.1 christos /* Don't allow just "maintenance cplus". */
1494 1.1 christos
1495 1.1 christos static void
1496 1.1 christos maint_cplus_command (char *arg, int from_tty)
1497 1.1 christos {
1498 1.1 christos printf_unfiltered (_("\"maintenance cplus\" must be followed "
1499 1.1 christos "by the name of a command.\n"));
1500 1.1 christos help_list (maint_cplus_cmd_list,
1501 1.1 christos "maintenance cplus ",
1502 1.1 christos -1, gdb_stdout);
1503 1.1 christos }
1504 1.1 christos
1505 1.1 christos /* This is a front end for cp_find_first_component, for unit testing.
1506 1.1 christos Be careful when using it: see the NOTE above
1507 1.1 christos cp_find_first_component. */
1508 1.1 christos
1509 1.1 christos static void
1510 1.1 christos first_component_command (char *arg, int from_tty)
1511 1.1 christos {
1512 1.1 christos int len;
1513 1.1 christos char *prefix;
1514 1.1 christos
1515 1.1 christos if (!arg)
1516 1.1 christos return;
1517 1.1 christos
1518 1.1 christos len = cp_find_first_component (arg);
1519 1.1 christos prefix = alloca (len + 1);
1520 1.1 christos
1521 1.1 christos memcpy (prefix, arg, len);
1522 1.1 christos prefix[len] = '\0';
1523 1.1 christos
1524 1.1 christos printf_unfiltered ("%s\n", prefix);
1525 1.1 christos }
1526 1.1 christos
1527 1.1 christos extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
1528 1.1 christos
1529 1.1 christos
1530 1.1 christos /* Implement "info vtbl". */
1531 1.1 christos
1532 1.1 christos static void
1533 1.1 christos info_vtbl_command (char *arg, int from_tty)
1534 1.1 christos {
1535 1.1 christos struct value *value;
1536 1.1 christos
1537 1.1 christos value = parse_and_eval (arg);
1538 1.1 christos cplus_print_vtable (value);
1539 1.1 christos }
1540 1.1 christos
1541 1.1 christos void
1542 1.1 christos _initialize_cp_support (void)
1543 1.1 christos {
1544 1.1 christos add_prefix_cmd ("cplus", class_maintenance,
1545 1.1 christos maint_cplus_command,
1546 1.1 christos _("C++ maintenance commands."),
1547 1.1 christos &maint_cplus_cmd_list,
1548 1.1 christos "maintenance cplus ",
1549 1.1 christos 0, &maintenancelist);
1550 1.1 christos add_alias_cmd ("cp", "cplus",
1551 1.1 christos class_maintenance, 1,
1552 1.1 christos &maintenancelist);
1553 1.1 christos
1554 1.1 christos add_cmd ("first_component",
1555 1.1 christos class_maintenance,
1556 1.1 christos first_component_command,
1557 1.1 christos _("Print the first class/namespace component of NAME."),
1558 1.1 christos &maint_cplus_cmd_list);
1559 1.1 christos
1560 1.1 christos add_info ("vtbl", info_vtbl_command,
1561 1.1 christos _("Show the virtual function table for a C++ object.\n\
1562 1.1 christos Usage: info vtbl EXPRESSION\n\
1563 1.1 christos Evaluate EXPRESSION and display the virtual function table for the\n\
1564 1.1 christos resulting object."));
1565 1.1 christos }
1566