daily update
[deliverable/binutils-gdb.git] / gdb / jv-exp.y
index f91e5bd55684d4360ffb4fbad833ca0a9ff96aec..a4e1253e34d07fdcf2afe3c04a3f063715a19f93 100644 (file)
@@ -1,6 +1,5 @@
 /* YACC parser for Java expressions, for GDB.
-   Copyright (C) 1997, 1998, 1999, 2000, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 1997-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -57,7 +56,7 @@
    yacc generated parsers in gdb.  Note that these are only the variables
    produced by yacc.  If other parser generators (bison, byacc, etc) produce
    additional global names that conflict at link time, then those parser
-   generators need to be fixed instead of adding those names to this list. */
+   generators need to be fixed instead of adding those names to this list.  */
 
 #define        yymaxdepth java_maxdepth
 #define        yyparse java_parse
 #define yygindex java_yygindex
 #define yytable         java_yytable
 #define yycheck         java_yycheck
+#define yyss   java_yyss
+#define yysslim        java_yysslim
+#define yyssp  java_yyssp
+#define yystacksize java_yystacksize
+#define yyvs   java_yyvs
+#define yyvsp  java_yyvsp
 
 #ifndef YYDEBUG
 #define        YYDEBUG 1               /* Default to yydebug support */
@@ -337,7 +342,7 @@ QualifiedName:
                { $$.length = $1.length + $3.length + 1;
                  if ($1.ptr + $1.length + 1 == $3.ptr
                      && $1.ptr[$1.length] == '.')
-                   $$.ptr = $1.ptr;  /* Optimization. */
+                   $$.ptr = $1.ptr;  /* Optimization.  */
                  else
                    {
                      $$.ptr = (char *) malloc ($$.length + 1);
@@ -495,7 +500,7 @@ PostfixExpression:
 |      Name
                { push_expression_name ($1); }
 |      VARIABLE
-               /* Already written by write_dollar_variable. */
+               /* Already written by write_dollar_variable.  */
 |      PostIncrementExpression
 |      PostDecrementExpression
 ;
@@ -547,7 +552,6 @@ CastExpression:
                  write_exp_elt_opcode (UNOP_CAST); }
 |      '(' Expression ')' UnaryExpressionNotPlusMinus
                {
-                 int exp_size = expout_ptr;
                  int last_exp_size = length_of_subexp(expout, expout_ptr);
                  struct type *type;
                  int i;
@@ -556,7 +560,7 @@ CastExpression:
                    error (_("Invalid cast expression"));
                  type = expout->elts[base+1].type;
                  /* Remove the 'Expression' and slide the
-                    UnaryExpressionNotPlusMinus down to replace it. */
+                    UnaryExpressionNotPlusMinus down to replace it.  */
                  for (i = 0;  i < last_exp_size;  i++)
                    expout->elts[base + i] = expout->elts[base + i + 3];
                  expout_ptr -= 3;
@@ -674,7 +678,7 @@ LeftHandSide:
        ForcedName
                { push_expression_name ($1); }
 |      VARIABLE
-               /* Already written by write_dollar_variable. */
+               /* Already written by write_dollar_variable.  */
 |      FieldAccess
 |      ArrayAccess
 ;
@@ -704,25 +708,28 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
 
   if (parsed_float)
     {
-      /* It's a float since it contains a point or an exponent.  */
-      char c;
-      int num = 0;     /* number of tokens scanned by scanf */
-      char saved_char = p[len];
-
-      p[len] = 0;      /* null-terminate the token */
-      num = sscanf (p, "%" DOUBLEST_SCAN_FORMAT "%c",
-                   &putithere->typed_val_float.dval, &c);
-      p[len] = saved_char;     /* restore the input stream */
-      if (num != 1)            /* check scanf found ONLY a float ... */
+      const char *suffix;
+      int suffix_len;
+
+      if (! parse_float (p, len, &putithere->typed_val_float.dval, &suffix))
        return ERROR;
-      /* See if it has `f' or `d' suffix (float or double).  */
 
-      c = tolower (p[len - 1]);
+      suffix_len = p + len - suffix;
 
-      if (c == 'f' || c == 'F')
-       putithere->typed_val_float.type = parse_type->builtin_float;
-      else if (isdigit (c) || c == '.' || c == 'd' || c == 'D')
+      if (suffix_len == 0)
        putithere->typed_val_float.type = parse_type->builtin_double;
+      else if (suffix_len == 1)
+       {
+         /* See if it has `f' or `d' suffix (float or double).  */
+         if (tolower (*suffix) == 'f')
+           putithere->typed_val_float.type =
+             parse_type->builtin_float;
+         else if (tolower (*suffix) == 'd')
+           putithere->typed_val_float.type =
+             parse_type->builtin_double;
+         else
+           return ERROR;
+       }
       else
        return ERROR;
 
@@ -761,7 +768,7 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
       }
 
   c = p[len-1];
-  /* A paranoid calculation of (1<<64)-1. */
+  /* A paranoid calculation of (1<<64)-1.  */
   limit = (ULONGEST)0xffffffff;
   limit = ((limit << 16) << 16) | limit;
   if (c == 'l' || c == 'L')
@@ -894,11 +901,11 @@ yylex (void)
     case '\'':
       /* We either have a character constant ('0' or '\177' for example)
         or we have a quoted symbol reference ('foo(int,int)' in C++
-        for example). */
+        for example).  */
       lexptr++;
       c = *lexptr++;
       if (c == '\\')
-       c = parse_escape (&lexptr);
+       c = parse_escape (parse_gdbarch, &lexptr);
       else if (c == '\'')
        error (_("Empty character constant"));
 
@@ -943,7 +950,7 @@ yylex (void)
     case '.':
       /* Might be a floating point number.  */
       if (lexptr[1] < '0' || lexptr[1] > '9')
-       goto symbol;            /* Nope, must be a symbol. */
+       goto symbol;            /* Nope, must be a symbol.  */
       /* FALL THRU into number case.  */
 
     case '0':
@@ -1048,7 +1055,7 @@ yylex (void)
 
       do {
        /* Grow the static temp buffer if necessary, including allocating
-          the first one on demand. */
+          the first one on demand.  */
        if (tempbufindex + 1 >= tempbufsize)
          {
            tempbuf = (char *) realloc (tempbuf, tempbufsize += 64);
@@ -1057,11 +1064,11 @@ yylex (void)
          {
          case '\0':
          case '"':
-           /* Do nothing, loop will terminate. */
+           /* Do nothing, loop will terminate.  */
            break;
          case '\\':
            tokptr++;
-           c = parse_escape (&tokptr);
+           c = parse_escape (parse_gdbarch, &tokptr);
            if (c == -1)
              {
                continue;
@@ -1214,13 +1221,13 @@ java_type_from_name (struct stoken name)
 }
 
 /* If NAME is a valid variable name in this scope, push it and return 1.
-   Otherwise, return 0. */
+   Otherwise, return 0.  */
 
 static int
 push_variable (struct stoken name)
 {
   char *tmp = copy_name (name);
-  int is_a_field_of_this = 0;
+  struct field_of_this_result is_a_field_of_this;
   struct symbol *sym;
   sym = lookup_symbol (tmp, expression_context_block, VAR_DOMAIN,
                       &is_a_field_of_this);
@@ -1241,7 +1248,7 @@ push_variable (struct stoken name)
       write_exp_elt_opcode (OP_VAR_VALUE);
       return 1;
     }
-  if (is_a_field_of_this)
+  if (is_a_field_of_this.type != NULL)
     {
       /* it hangs off of `this'.  Must not inadvertently convert from a
         method call to data ref.  */
@@ -1260,7 +1267,7 @@ push_variable (struct stoken name)
 
 /* Assuming a reference expression has been pushed, emit the
    STRUCTOP_PTR ops to access the field named NAME.  If NAME is a
-   qualified name (has '.'), generate a field access for each part. */
+   qualified name (has '.'), generate a field access for each part.  */
 
 static void
 push_fieldnames (struct stoken name)
@@ -1272,7 +1279,7 @@ push_fieldnames (struct stoken name)
     {
       if (i == name.length || name.ptr[i] == '.')
        {
-         /* token.ptr is start of current field name. */
+         /* token.ptr is start of current field name.  */
          token.length = &name.ptr[i] - token.ptr;
          write_exp_elt_opcode (STRUCTOP_PTR);
          write_exp_string (token);
@@ -1351,27 +1358,26 @@ push_qualified_expression_name (struct stoken name, int dot_index)
 }
 
 /* Handle Name in an expression (or LHS).
-   Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN. */
+   Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN.  */
 
 static void
 push_expression_name (struct stoken name)
 {
   char *tmp;
   struct type *typ;
-  char *ptr;
   int i;
 
   for (i = 0;  i < name.length;  i++)
     {
       if (name.ptr[i] == '.')
        {
-         /* It's a Qualified Expression Name. */
+         /* It's a Qualified Expression Name.  */
          push_qualified_expression_name (name, i);
          return;
        }
     }
 
-  /* It's a Simple Expression Name. */
+  /* It's a Simple Expression Name.  */
   
   if (push_variable (name))
     return;
@@ -1385,15 +1391,15 @@ push_expression_name (struct stoken name)
     }
   else
     {
-      struct minimal_symbol *msymbol;
+      struct bound_minimal_symbol msymbol;
 
-      msymbol = lookup_minimal_symbol (tmp, NULL, NULL);
-      if (msymbol != NULL)
+      msymbol = lookup_bound_minimal_symbol (tmp);
+      if (msymbol.minsym != NULL)
        write_exp_msymbol (msymbol);
       else if (!have_full_symbols () && !have_partial_symbols ())
        error (_("No symbol table is loaded.  Use the \"file\" command"));
       else
-       error (_("No symbol \"%s\" in current context"), tmp);
+       error (_("No symbol \"%s\" in current context."), tmp);
     }
 
 }
This page took 0.027141 seconds and 4 git commands to generate.