* eval.c (evaluate_subexp_standard): Add some comments.
authorDoug Evans <dje@google.com>
Mon, 19 May 2014 17:51:08 +0000 (10:51 -0700)
committerDoug Evans <dje@google.com>
Mon, 19 May 2014 17:51:08 +0000 (10:51 -0700)
gdb/ChangeLog
gdb/eval.c

index 2311d7753d89fd9a02c5c720b971662e1c875272..499775119fbeeaa0752a2fb53228cd2fc0c43aba 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-19  Doug Evans  <dje@google.com>
+
+       * eval.c (evaluate_subexp_standard): Add some comments.
+
 2014-05-17  Doug Evans  <xdje42@gmail.com>
 
        * progspace.c (remove_program_space): Delete, unused.
index 3e62eadc8aa9f0d051efb6159fedd36b82ed276d..14bf6f7bae020f023f9c899b1052e25e6baeea1f 100644 (file)
@@ -1363,7 +1363,7 @@ evaluate_subexp_standard (struct type *expect_type,
       op = exp->elts[*pos].opcode;
       nargs = longest_to_int (exp->elts[pc + 1].longconst);
       /* Allocate arg vector, including space for the function to be
-         called in argvec[0] and a terminating NULL.  */
+         called in argvec[0], a potential `this', and a terminating NULL.  */
       argvec = (struct value **)
        alloca (sizeof (struct value *) * (nargs + 3));
       if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
@@ -1514,6 +1514,7 @@ evaluate_subexp_standard (struct type *expect_type,
                       name, TYPE_TAG_NAME (type));
 
              tem = 1;
+             /* arg2 is left as NULL on purpose.  */
            }
          else
            {
@@ -1521,6 +1522,8 @@ evaluate_subexp_standard (struct type *expect_type,
                          || TYPE_CODE (type) == TYPE_CODE_UNION);
              function_name = name;
 
+             /* We need a properly typed value for method lookup.  For
+                static methods arg2 is otherwise unused.  */
              arg2 = value_zero (type, lval_memory);
              ++nargs;
              tem = 2;
@@ -1570,7 +1573,8 @@ evaluate_subexp_standard (struct type *expect_type,
            }
        }
 
-      /* Evaluate arguments.  */
+      /* Evaluate arguments (if not already done, e.g., namespace::func()
+        and overload-resolution is off).  */
       for (; tem <= nargs; tem++)
        {
          /* Ensure that array expressions are coerced into pointer
@@ -1580,6 +1584,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
       /* Signal end of arglist.  */
       argvec[tem] = 0;
+
       if (op == OP_ADL_FUNC)
         {
           struct symbol *symp;
@@ -1609,7 +1614,8 @@ evaluate_subexp_standard (struct type *expect_type,
          int static_memfuncp;
          char *tstr;
 
-         /* Method invocation : stuff "this" as first parameter.  */
+         /* Method invocation: stuff "this" as first parameter.
+            If the method turns out to be static we undo this below.  */
          argvec[1] = arg2;
 
          if (op != OP_SCOPE)
@@ -1663,6 +1669,7 @@ evaluate_subexp_standard (struct type *expect_type,
              argvec[1] = arg2; /* the ``this'' pointer */
            }
 
+         /* Take out `this' if needed.  */
          if (static_memfuncp)
            {
              argvec[1] = argvec[0];