diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/expprint.c | 75 |
2 files changed, 72 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cc6f6ed..16d64b7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +Tue Apr 27 13:44:19 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * expprint.c (print_subexp): Fix bug with OP_SCOPE operator output. + Tue Apr 27 10:01:33 1993 Jim Kingdon (kingdon@cygnus.com) * remote-vx.c (net_connect): Allow numeric IP address for host. 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; |