diff options
author | Tom Tromey <tromey@redhat.com> | 2008-06-06 20:58:08 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2008-06-06 20:58:08 +0000 |
commit | 65d12d83a581c833b3c09acead57dd1134154e46 (patch) | |
tree | 5115b47443ba264269ce3c9445015317a78ceeea /gdb/eval.c | |
parent | 90aa6a4044aa608595b9a97944e27541bdd4ebf7 (diff) | |
download | gdb-65d12d83a581c833b3c09acead57dd1134154e46.zip gdb-65d12d83a581c833b3c09acead57dd1134154e46.tar.gz gdb-65d12d83a581c833b3c09acead57dd1134154e46.tar.bz2 |
gdb
* value.h (evaluate_subexpression_type, extract_field_op):
Declare.
* printcmd.c (_initialize_printcmd): Use expression_completer for
'p', 'inspect', 'call'.
* parser-defs.h (parse_field_expression): Declare.
* parse.c: Include exceptions.h.
(in_parse_field, expout_last_struct): New globals.
(mark_struct_expression): New function.
(prefixify_expression): Return int.
(prefixify_subexp): Return int. Use expout_last_struct.
(parse_exp_1): Update.
(parse_exp_in_context): Add 'out_subexp' argument. Handle
in_parse_field.
(parse_field_expression): New function.
* expression.h (parse_field_expression): Declare.
(in_parse_field): Likewise.
* eval.c (evaluate_subexpression_type): New function.
(extract_field_op): Likewise.
* completer.h (expression_completer): Declare.
* completer.c (expression_completer): New function.
(count_struct_fields, add_struct_fields): New functions.
* c-exp.y (yyparse): Redefine.
(COMPLETE): New token.
(exp): New productions.
(saw_name_at_eof, last_was_structop): New globals.
(yylex): Return COMPLETE when needed. Recognize in_parse_field.
(c_parse): New function.
* breakpoint.c (_initialize_breakpoint): Use expression_completer
for watch, awatch, and rwatch.
* Makefile.in (parse.o): Depend on exceptions_h.
gdb/testsuite
* gdb.base/break1.c (struct some_struct): New struct.
(values): New global.
* gdb.base/completion.exp: Add field name completion test.
gdb/doc
* gdb.texinfo (Completion): Add field name example.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r-- | gdb/eval.c | 30 |
1 files changed, 30 insertions, 0 deletions
@@ -175,6 +175,36 @@ evaluate_type (struct expression *exp) return evaluate_subexp (NULL_TYPE, exp, &pc, EVAL_AVOID_SIDE_EFFECTS); } +/* Evaluate a subexpression, avoiding all memory references and + getting a value whose type alone is correct. */ + +struct value * +evaluate_subexpression_type (struct expression *exp, int subexp) +{ + return evaluate_subexp (NULL_TYPE, exp, &subexp, EVAL_AVOID_SIDE_EFFECTS); +} + +/* Extract a field operation from an expression. If the subexpression + of EXP starting at *SUBEXP is not a structure dereference + operation, return NULL. Otherwise, return the name of the + dereferenced field, and advance *SUBEXP to point to the + subexpression of the left-hand-side of the dereference. This is + used when completing field names. */ + +char * +extract_field_op (struct expression *exp, int *subexp) +{ + int tem; + char *result; + if (exp->elts[*subexp].opcode != STRUCTOP_STRUCT + && exp->elts[*subexp].opcode != STRUCTOP_PTR) + return NULL; + tem = longest_to_int (exp->elts[*subexp + 1].longconst); + result = &exp->elts[*subexp + 2].string; + (*subexp) += 1 + 3 + BYTES_TO_EXP_ELEM (tem + 1); + return result; +} + /* If the next expression is an OP_LABELED, skips past it, returning the label. Otherwise, does nothing and returns NULL. */ |