PR python/14634:
[deliverable/binutils-gdb.git] / gdb / expprint.c
index 1d2ce8534eeb41cb89d74ae20b3a368664d2c3f4..baaa08ad14aaaae7522d2298c39548cf7609f075 100644 (file)
@@ -1,8 +1,7 @@
 /* Print in infix form a struct expression.
 
-   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2003, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 1986, 1988-1989, 1991-2000, 2003, 2007-2012 Free
+   Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -84,6 +83,11 @@ print_subexp_standard (struct expression *exp, int *pos,
     {
       /* Common ops */
 
+    case OP_TYPE:
+      (*pos) += 2;
+      type_print (exp->elts[pc + 1].type, "", stream, 0);
+      return;
+
     case OP_SCOPE:
       myprec = PREC_PREFIX;
       assoc = 0;
@@ -135,6 +139,14 @@ print_subexp_standard (struct expression *exp, int *pos,
       }
       return;
 
+    case OP_VAR_ENTRY_VALUE:
+      {
+       (*pos) += 2;
+       fprintf_filtered (stream, "%s@entry",
+                         SYMBOL_PRINT_NAME (exp->elts[pc + 1].symbol));
+      }
+      return;
+
     case OP_LAST:
       (*pos) += 2;
       fprintf_filtered (stream, "$%d",
@@ -198,13 +210,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       }
       return;
 
-    case OP_BITSTRING:
-      nargs = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos)
-       += 3 + BYTES_TO_EXP_ELEM ((nargs + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT);
-      fprintf_unfiltered (stream, "B'<unimplemented>'");
-      return;
-
     case OP_OBJC_NSSTRING:     /* Objective-C Foundation Class
                                   NSString constant.  */
       {
@@ -355,7 +360,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       return;
 
     case TERNOP_SLICE:
-    case TERNOP_SLICE_COUNT:
       print_subexp (exp, pos, stream, PREC_SUFFIX);
       fputs_filtered ("(", stream);
       print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
@@ -422,13 +426,23 @@ print_subexp_standard (struct expression *exp, int *pos,
        fputs_filtered (")", stream);
       return;
 
+    case UNOP_CAST_TYPE:
+      if ((int) prec > (int) PREC_PREFIX)
+       fputs_filtered ("(", stream);
+      fputs_filtered ("(", stream);
+      print_subexp (exp, pos, stream, PREC_PREFIX);
+      fputs_filtered (") ", stream);
+      print_subexp (exp, pos, stream, PREC_PREFIX);
+      if ((int) prec > (int) PREC_PREFIX)
+       fputs_filtered (")", stream);
+      return;
+
     case UNOP_DYNAMIC_CAST:
     case UNOP_REINTERPRET_CAST:
       fputs_filtered (opcode == UNOP_DYNAMIC_CAST ? "dynamic_cast"
                      : "reinterpret_cast", stream);
       fputs_filtered ("<", stream);
-      (*pos) += 2;
-      type_print (exp->elts[pc + 1].type, "", stream, 0);
+      print_subexp (exp, pos, stream, PREC_PREFIX);
       fputs_filtered ("> (", stream);
       print_subexp (exp, pos, stream, PREC_PREFIX);
       fputs_filtered (")", stream);
@@ -464,6 +478,17 @@ print_subexp_standard (struct expression *exp, int *pos,
        fputs_filtered (")", stream);
       return;
 
+    case UNOP_MEMVAL_TYPE:
+      if ((int) prec > (int) PREC_PREFIX)
+       fputs_filtered ("(", stream);
+      fputs_filtered ("{", stream);
+      print_subexp (exp, pos, stream, PREC_PREFIX);
+      fputs_filtered ("} ", stream);
+      print_subexp (exp, pos, stream, PREC_PREFIX);
+      if ((int) prec > (int) PREC_PREFIX)
+       fputs_filtered (")", stream);
+      return;
+
     case UNOP_MEMVAL_TLS:
       (*pos) += 3;
       if ((int) prec > (int) PREC_PREFIX)
@@ -499,14 +524,11 @@ print_subexp_standard (struct expression *exp, int *pos,
 
     case OP_THIS:
       ++(*pos);
-      fputs_filtered ("this", stream);
-      return;
-
-      /* Objective-C ops */
-
-    case OP_OBJC_SELF:
-      ++(*pos);
-      fputs_filtered ("self", stream); /* The ObjC equivalent of "this".  */
+      if (exp->language_defn->la_name_of_this)
+       fputs_filtered (exp->language_defn->la_name_of_this, stream);
+      else
+       fprintf_filtered (stream, _("<language %s has no 'this'>"),
+                         exp->language_defn->la_name);
       return;
 
       /* Modula-2 ops */
@@ -534,6 +556,27 @@ print_subexp_standard (struct expression *exp, int *pos,
       fprintf_unfiltered (stream, ")");
       return;
 
+    case TYPE_INSTANCE:
+      {
+       LONGEST count = exp->elts[pc + 1].longconst;
+
+       /* The COUNT.  */
+       (*pos)++;
+       fputs_unfiltered ("TypesInstance(", stream);
+       while (count-- > 0)
+         {
+           type_print (exp->elts[(*pos)++].type, "", stream, 0);
+           if (count > 0)
+             fputs_unfiltered (",", stream);
+         }
+       fputs_unfiltered (",", stream);
+       /* Ending COUNT and ending TYPE_INSTANCE.  */
+       (*pos) += 2;
+       print_subexp (exp, pos, stream, PREC_PREFIX);
+       fputs_unfiltered (")", stream);
+       return;
+      }
+
       /* Default ops */
 
     default:
@@ -620,12 +663,11 @@ op_string (enum exp_opcode op)
 /* Support for dumping the raw data from expressions in a human readable
    form.  */
 
-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 *
+char *
 op_name (struct expression *exp, enum exp_opcode opcode)
 {
   return exp->language_defn->la_exp_desc->op_name (opcode);
@@ -744,8 +786,8 @@ dump_subexp_body_standard (struct expression *exp,
     {
     case TERNOP_COND:
     case TERNOP_SLICE:
-    case TERNOP_SLICE_COUNT:
       elt = dump_subexp (exp, stream, elt);
+      /* FALL THROUGH */
     case BINOP_ADD:
     case BINOP_SUB:
     case BINOP_MUL:
@@ -782,6 +824,7 @@ dump_subexp_body_standard (struct expression *exp,
     case STRUCTOP_MEMBER:
     case STRUCTOP_MPTR:
       elt = dump_subexp (exp, stream, elt);
+      /* FALL THROUGH */
     case UNOP_NEG:
     case UNOP_LOGICAL_NOT:
     case UNOP_COMPLEMENT:
@@ -833,6 +876,13 @@ dump_subexp_body_standard (struct expression *exp,
                        SYMBOL_PRINT_NAME (exp->elts[elt + 1].symbol));
       elt += 3;
       break;
+    case OP_VAR_ENTRY_VALUE:
+      fprintf_filtered (stream, "Entry value of symbol @");
+      gdb_print_host_address (exp->elts[elt].symbol, stream);
+      fprintf_filtered (stream, " (%s)",
+                       SYMBOL_PRINT_NAME (exp->elts[elt].symbol));
+      elt += 2;
+      break;
     case OP_LAST:
       fprintf_filtered (stream, "History element %ld",
                        (long) exp->elts[elt].longconst);
@@ -877,10 +927,17 @@ dump_subexp_body_standard (struct expression *exp,
          elt = dump_subexp (exp, stream, elt);
       }
       break;
-    case UNOP_MEMVAL:
-    case UNOP_CAST:
     case UNOP_DYNAMIC_CAST:
     case UNOP_REINTERPRET_CAST:
+    case UNOP_CAST_TYPE:
+    case UNOP_MEMVAL_TYPE:
+      fprintf_filtered (stream, " (");
+      elt = dump_subexp (exp, stream, elt);
+      fprintf_filtered (stream, ")");
+      elt = dump_subexp (exp, stream, elt);
+      break;
+    case UNOP_MEMVAL:
+    case UNOP_CAST:
       fprintf_filtered (stream, "Type @");
       gdb_print_host_address (exp->elts[elt].type, stream);
       fprintf_filtered (stream, " (");
@@ -906,6 +963,12 @@ dump_subexp_body_standard (struct expression *exp,
       fprintf_filtered (stream, ")");
       elt += 2;
       break;
+    case OP_TYPEOF:
+    case OP_DECLTYPE:
+      fprintf_filtered (stream, "Typeof (");
+      elt = dump_subexp (exp, stream, elt);
+      fprintf_filtered (stream, ")");
+      break;
     case STRUCTOP_STRUCT:
     case STRUCTOP_PTR:
       {
@@ -937,13 +1000,34 @@ dump_subexp_body_standard (struct expression *exp,
        elt += 4 + BYTES_TO_EXP_ELEM (len + 1);
       }
       break;
+    case TYPE_INSTANCE:
+      {
+       LONGEST len;
+
+       len = exp->elts[elt++].longconst;
+       fprintf_filtered (stream, "%s TypeInstance: ", plongest (len));
+       while (len-- > 0)
+         {
+           fprintf_filtered (stream, "Type @");
+           gdb_print_host_address (exp->elts[elt].type, stream);
+           fprintf_filtered (stream, " (");
+           type_print (exp->elts[elt].type, NULL, stream, 0);
+           fprintf_filtered (stream, ")");
+           elt++;
+           if (len > 0)
+             fputs_filtered (", ", stream);
+         }
+       /* Ending LEN and ending TYPE_INSTANCE.  */
+       elt += 2;
+       elt = dump_subexp (exp, stream, elt);
+      }
+      break;
     default:
     case OP_NULL:
     case MULTI_SUBSCRIPT:
     case OP_F77_UNDETERMINED_ARGLIST:
     case OP_COMPLEX:
     case OP_STRING:
-    case OP_BITSTRING:
     case OP_BOOL:
     case OP_M2_STRING:
     case OP_THIS:
@@ -963,10 +1047,7 @@ dump_prefix_expression (struct expression *exp, struct ui_file *stream)
   fprintf_filtered (stream, "Dump of expression @ ");
   gdb_print_host_address (exp, stream);
   fputs_filtered (", after conversion to prefix form:\nExpression: `", stream);
-  if (exp->elts[0].opcode != OP_TYPE)
-    print_expression (exp, stream);
-  else
-    fputs_filtered ("Type printing not yet supported....", stream);
+  print_expression (exp, stream);
   fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
                    exp->language_defn->la_name, exp->nelts,
                    (long) sizeof (union exp_element));
This page took 0.029179 seconds and 4 git commands to generate.