Reviewed and approved by Alan Modra <amodra@bigpond.net.au>
[deliverable/binutils-gdb.git] / gdb / expprint.c
index a3001b1b338c65f8fb3da6b2083cc98ab0260a71..5949475927e2590e053adec7c11ef72403497225 100644 (file)
 #include <ctype.h>
 #endif
 
-/* Prototypes for local functions */
-
-static void print_subexp (struct expression *, int *, struct ui_file *,
-                         enum precedence);
-
 void
 print_expression (struct expression *exp, struct ui_file *stream)
 {
@@ -53,9 +48,18 @@ print_expression (struct expression *exp, struct ui_file *stream)
    if the precedence of the main operator of this subexpression is less,
    parentheses are needed here.  */
 
-static void
+void
 print_subexp (struct expression *exp, int *pos,
              struct ui_file *stream, enum precedence prec)
+{
+  exp->language_defn->la_exp_desc->print_subexp (exp, pos, stream, prec);
+}
+
+/* Standard implementation of print_subexp for use in language_defn
+   vectors.  */
+void
+print_subexp_standard (struct expression *exp, int *pos,
+                      struct ui_file *stream, enum precedence prec)
 {
   unsigned tem;
   const struct op_print *op_print_tab;
@@ -547,10 +551,22 @@ op_string (enum exp_opcode op)
 /* Support for dumping the raw data from expressions in a human readable
    form.  */
 
-static char *op_name (int opcode);
+static char *op_name (struct expression *, enum exp_opcode);
+static int dump_subexp_body (struct expression *exp, struct ui_file *, int);
+
+/* Name for OPCODE, when it appears in expression EXP. */
 
 static char *
-op_name (int opcode)
+op_name (struct expression *exp, enum exp_opcode opcode)
+{
+  return exp->language_defn->la_exp_desc->op_name (opcode);
+}
+
+/* Default name for the standard operator OPCODE (i.e., one defined in
+   the definition of enum exp_opcode).  */
+
+char *
+op_name_standard (enum exp_opcode opcode)
 {
   switch (opcode)
     {
@@ -737,8 +753,8 @@ op_name (int opcode)
 }
 
 void
-dump_prefix_expression (struct expression *exp, struct ui_file *stream,
-                       char *note)
+dump_raw_expression (struct expression *exp, struct ui_file *stream,
+                    char *note)
 {
   int elt;
   char *opcode_name;
@@ -747,11 +763,6 @@ dump_prefix_expression (struct expression *exp, struct ui_file *stream,
 
   fprintf_filtered (stream, "Dump of expression @ ");
   gdb_print_host_address (exp, stream);
-  fprintf_filtered (stream, ", %s:\nExpression: `", note);
-  if (exp->elts[0].opcode != OP_TYPE)
-    print_expression (exp, stream);
-  else
-    fprintf_filtered (stream, "Type printing not yet supported....");
   fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
                    exp->language_defn->la_name, exp->nelts,
                    (long) sizeof (union exp_element));
@@ -760,7 +771,7 @@ dump_prefix_expression (struct expression *exp, struct ui_file *stream,
   for (elt = 0; elt < exp->nelts; elt++)
     {
       fprintf_filtered (stream, "\t%5d  ", elt);
-      opcode_name = op_name (exp->elts[elt].opcode);
+      opcode_name = op_name (exp, exp->elts[elt].opcode);
 
       fprintf_filtered (stream, "%20s  ", opcode_name);
       print_longest (stream, 'd', 0, exp->elts[elt].longconst);
@@ -778,10 +789,11 @@ dump_prefix_expression (struct expression *exp, struct ui_file *stream,
     }
 }
 
-static int dump_subexp (struct expression *exp, struct ui_file *stream,
-                       int elt);
+/* Dump the subexpression of prefix expression EXP whose operator is at
+   position ELT onto STREAM.  Returns the position of the next 
+   subexpression in EXP.  */
 
-static int
+int
 dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
 {
   static int indent = 0;
@@ -794,9 +806,34 @@ dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
     fprintf_filtered (stream, " ");
   indent += 2;
 
-  fprintf_filtered (stream, "%-20s  ", op_name (exp->elts[elt].opcode));
+  fprintf_filtered (stream, "%-20s  ", op_name (exp, exp->elts[elt].opcode));
 
-  switch (exp->elts[elt++].opcode)
+  elt = dump_subexp_body (exp, stream, elt);
+
+  indent -= 2;
+
+  return elt;
+}
+
+/* Dump the operands of prefix expression EXP whose opcode is at
+   position ELT onto STREAM.  Returns the position of the next 
+   subexpression in EXP.  */
+
+static int
+dump_subexp_body (struct expression *exp, struct ui_file *stream, int elt)
+{
+  return exp->language_defn->la_exp_desc->dump_subexp_body (exp, stream, elt);
+}
+
+/* Default value for subexp_body in exp_descriptor vector.  */
+
+int
+dump_subexp_body_standard (struct expression *exp, 
+                          struct ui_file *stream, int elt)
+{
+  int opcode = exp->elts[elt++].opcode;
+
+  switch (opcode)
     {
     case TERNOP_COND:
     case TERNOP_SLICE:
@@ -914,7 +951,7 @@ dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
       break;
     case OP_FUNCALL:
       {
-       int nargs;
+       int i, nargs;
 
        nargs = longest_to_int (exp->elts[elt].longconst);
 
@@ -1006,20 +1043,17 @@ dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
       fprintf_filtered (stream, "Unknown format");
     }
 
-  indent -= 2;
-
   return elt;
 }
 
 void
-dump_postfix_expression (struct expression *exp, struct ui_file *stream,
-                        char *note)
+dump_prefix_expression (struct expression *exp, struct ui_file *stream)
 {
   int elt;
 
   fprintf_filtered (stream, "Dump of expression @ ");
   gdb_print_host_address (exp, stream);
-  fprintf_filtered (stream, ", %s:\nExpression: `", note);
+  fputs_filtered (", after conversion to prefix form:\nExpression: `", stream);
   if (exp->elts[0].opcode != OP_TYPE)
     print_expression (exp, stream);
   else
This page took 0.026948 seconds and 4 git commands to generate.