aboutsummaryrefslogtreecommitdiff
path: root/gdb/expprint.c
diff options
context:
space:
mode:
authorPeter Schauer <Peter.Schauer@mytum.de>1993-04-27 20:46:25 +0000
committerPeter Schauer <Peter.Schauer@mytum.de>1993-04-27 20:46:25 +0000
commitf661c4ca088988b2ed56693d7d6c97f43e435600 (patch)
tree294ad4d112e8c1c223c629cc5291439361213e7b /gdb/expprint.c
parentebe8362f904531d0412cfe14394f1bae103b721b (diff)
downloadgdb-f661c4ca088988b2ed56693d7d6c97f43e435600.zip
gdb-f661c4ca088988b2ed56693d7d6c97f43e435600.tar.gz
gdb-f661c4ca088988b2ed56693d7d6c97f43e435600.tar.bz2
* expprint.c (print_subexp): Fix bug with OP_SCOPE operator output.
Diffstat (limited to 'gdb/expprint.c')
-rw-r--r--gdb/expprint.c75
1 files changed, 68 insertions, 7 deletions
diff --git a/gdb/expprint.c b/gdb/expprint.c
index b50086a..18b0ac7 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -65,6 +65,7 @@ print_subexp (exp, pos, stream, prec)
/* Set to 1 for a right-associative operator. */
int assoc;
value val;
+ char *tempstr;
op_print_tab = exp->language_defn->la_op_print_tab;
pc = (*pos)++;
@@ -76,12 +77,10 @@ print_subexp (exp, pos, stream, prec)
case OP_SCOPE:
myprec = PREC_PREFIX;
assoc = 0;
- (*pos) += 3;
- print_subexp (exp, pos, stream,
- (enum precedence) ((int) myprec + assoc));
- fputs_filtered (" :: ", stream);
+ fputs_filtered (type_name_no_tag (exp->elts[pc + 1].type), stream);
+ fputs_filtered ("::", stream);
nargs = longest_to_int (exp->elts[pc + 2].longconst);
- (*pos) += 2 + BYTES_TO_EXP_ELEM (nargs + 1);
+ (*pos) += 4 + BYTES_TO_EXP_ELEM (nargs + 1);
fputs_filtered (&exp->elts[pc + 3].string, stream);
return;
@@ -157,8 +156,60 @@ print_subexp (exp, pos, stream, prec)
break;
case OP_ARRAY:
- error ("support for OP_ARRAY unimplemented");
- break;
+ (*pos) += 3;
+ nargs = longest_to_int (exp->elts[pc + 2].longconst);
+ nargs -= longest_to_int (exp->elts[pc + 1].longconst);
+ nargs++;
+ tem = 0;
+ if (exp->elts[pc + 4].opcode == OP_LONG
+ && exp->elts[pc + 5].type == builtin_type_char
+ && exp->language_defn->la_language == language_c)
+ {
+ /* Attempt to print C character arrays using string syntax.
+ Walk through the args, picking up one character from each
+ of the OP_LONG expression elements. If any array element
+ does not match our expection of what we should find for
+ a simple string, revert back to array printing. Note that
+ the last expression element is an explicit null terminator
+ byte, which doesn't get printed. */
+ tempstr = alloca (nargs);
+ pc += 4;
+ while (tem < nargs)
+ {
+ if (exp->elts[pc].opcode != OP_LONG
+ || exp->elts[pc + 1].type != builtin_type_char)
+ {
+ /* Not a simple array of char, use regular array printing. */
+ tem = 0;
+ break;
+ }
+ else
+ {
+ tempstr[tem++] =
+ longest_to_int (exp->elts[pc + 2].longconst);
+ pc += 4;
+ }
+ }
+ }
+ if (tem > 0)
+ {
+ LA_PRINT_STRING (stream, tempstr, nargs - 1, 0);
+ (*pos) = pc;
+ }
+ else
+ {
+ fputs_filtered (" {", stream);
+ for (tem = 0; tem < nargs; tem++)
+ {
+ if (tem != 0)
+ {
+ fputs_filtered (", ", stream);
+ }
+ print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
+ }
+ fputs_filtered ("}", stream);
+ }
+ return;
case TERNOP_COND:
if ((int) prec > (int) PREC_COMMA)
@@ -259,6 +310,10 @@ print_subexp (exp, pos, stream, prec)
op_str = op_print_tab[tem].string;
break;
}
+ if (op_print_tab[tem].opcode != opcode)
+ /* Not found; don't try to keep going because we don't know how
+ to interpret further elements. */
+ error ("Invalid expression");
break;
/* C++ ops */
@@ -349,6 +404,11 @@ print_subexp (exp, pos, stream, prec)
assoc = op_print_tab[tem].right_assoc;
break;
}
+ if (op_print_tab[tem].opcode != opcode)
+ /* Not found; don't try to keep going because we don't know how
+ to interpret further elements. For example, this happens
+ if opcode is OP_TYPE. */
+ error ("Invalid expression");
}
if ((int) myprec < (int) prec)
@@ -483,6 +543,7 @@ dump_expression (exp, stream, note)
case BINOP_VAL: opcode_name = "BINOP_VAL"; break;
case BINOP_INCL: opcode_name = "BINOP_INCL"; break;
case BINOP_EXCL: opcode_name = "BINOP_EXCL"; break;
+ case BINOP_CONCAT: opcode_name = "BINOP_CONCAT"; break;
case BINOP_END: opcode_name = "BINOP_END"; break;
case TERNOP_COND: opcode_name = "TERNOP_COND"; break;
case OP_LONG: opcode_name = "OP_LONG"; break;