This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Java: method parameters order of evaluation fix.


I just checked in a patch to enforce left-to-right order of evaluation
for method parameters. This patch is also a maintenance patch, fixing
glitches in the ambiguous names qualifier routine.

./A

Sat Jul  3 22:26:32 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed
 	CALL_EXPR, to avoid order of evaluation changes.

Fri Jul  2 17:44:08 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* parse.y (qualify_ambiguous_name): Do not use
 	IDENTIFIER_LOCAL_VALUE when name is a STRING_CST.

Thu Jul  1 23:31:16 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* check-init.c (check_init): Handle MAX_EXPR.
	* expr.c (force_evaluation_order): Force method call arguments to
 	be evaluated in left-to-right order.
	* parse.y (qualify_ambiguous_name): Loop again to qualify
 	NEW_ARRAY_EXPR properly.

Wed Jun 30 17:27:58 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* parse.y (patch_invoke): Resolve unresolved invoked method
 	returned type.
	(qualify_ambiguous_name): STRING_CST to qualify expression for
 	type name resolution.

Index: check-init.c
===================================================================
RCS file: /cvs/egcs/egcs/gcc/java/check-init.c,v
retrieving revision 1.11
diff -u -p -r1.11 check-init.c
--- check-init.c	1999/05/14 13:44:08	1.11
+++ check-init.c	1999/07/07 19:39:56
@@ -643,6 +643,7 @@ check_init (exp, before)
     case GE_EXPR:
     case LT_EXPR:
     case LE_EXPR:
+    case MAX_EXPR:
     case ARRAY_REF:
     binop:
       check_init (TREE_OPERAND (exp, 0), before);
Index: expr.c
===================================================================
RCS file: /cvs/egcs/egcs/gcc/java/expr.c,v
retrieving revision 1.38
diff -u -p -r1.38 expr.c
--- expr.c	1999/06/02 11:00:44	1.38
+++ expr.c	1999/07/07 19:40:02
@@ -2578,6 +2578,10 @@ process_jvm_instruction (PC, byte_ops, l
 
    We fix this by using save_expr.  This forces the sub-operand to be
    copied into a fresh virtual register,
+
+   For method invocation, we modify the arguments so that a
+   left-to-right order evaluation is performed. Saved expressions
+   will, in CALL_EXPR order, be reused when the call will be expanded.
 */
 
 tree
@@ -2593,19 +2597,30 @@ force_evaluation_order (node)
     }
   else if (TREE_CODE (node) == CALL_EXPR || TREE_CODE (node) == NEW_CLASS_EXPR)
     {
-      tree last_side_effecting_arg = NULL_TREE;
-      tree arg = TREE_OPERAND (node, 1);
-      for (; arg != NULL_TREE; arg = TREE_CHAIN (arg))
+      tree arg, cmp;
+
+      if (!TREE_OPERAND (node, 1))
+	return node;
+
+      /* This reverses the evaluation order. This is a desired effect. */
+      for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1); 
+	   arg; arg = TREE_CHAIN (arg))
 	{
-	  if (TREE_SIDE_EFFECTS (TREE_VALUE (arg)))
-	    last_side_effecting_arg = arg;
+	  tree saved = save_expr (TREE_VALUE (arg));
+	  cmp = (cmp == NULL_TREE ? saved :
+		 build (COMPOUND_EXPR, void_type_node, cmp, saved));
+	  TREE_VALUE (arg) = saved;
 	}
-      arg = TREE_OPERAND (node, 1);
-      for (; arg != NULL_TREE;  arg = TREE_CHAIN (arg))
+      
+      if (cmp && TREE_CODE (cmp) == COMPOUND_EXPR)
+	TREE_SIDE_EFFECTS (cmp) = 1;
+
+      if (cmp)
 	{
-	  if (arg == last_side_effecting_arg)
-	    break;
-	  TREE_VALUE (arg) = save_expr (TREE_VALUE (arg)); 
+	  cmp = save_expr (build (COMPOUND_EXPR, TREE_TYPE (node), cmp, node));
+	  CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);
+	  TREE_SIDE_EFFECTS (cmp) = 1;
+	  node = cmp;
 	}
     }
   return node;
Index: parse.y
===================================================================
RCS file: /cvs/egcs/egcs/gcc/java/parse.y,v
retrieving revision 1.93
diff -u -p -r1.93 parse.y
--- parse.y	1999/06/25 16:33:20	1.93
+++ parse.y	1999/07/07 19:41:04
@@ -7228,6 +7228,11 @@ patch_invoke (patch, method, args)
     if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
 	TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
       TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
+
+  /* Resolve unresolved returned type isses */
+  t = TREE_TYPE (TREE_TYPE (method));
+  if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
+    resolve_and_layout (TREE_TYPE (t), NULL);
   
   if (flag_emit_class_files || flag_emit_xref)
     func = method;
@@ -7638,7 +7643,7 @@ qualify_ambiguous_name (id)
 	break;
       case NEW_ARRAY_EXPR:
 	qual = TREE_CHAIN (qual);
-	new_array_found = 1;
+	again = new_array_found = 1;
 	continue;
       case NEW_CLASS_EXPR:
       case CONVERT_EXPR:
@@ -7716,7 +7721,8 @@ qualify_ambiguous_name (id)
      declaration or parameter declaration, then it is an expression
      name. We don't carry this test out if we're in the context of the
      use of SUPER or THIS */
-  if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
+  if (!this_found && !super_found && 
+      TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
     {
       RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;
@@ -7733,15 +7739,17 @@ qualify_ambiguous_name (id)
       QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
     }
 
-  /* We reclassify NAME as a type name if:
+  /* We reclassify NAME as yielding to a type name resolution if:
      - NAME is a class/interface declared within the compilation
        unit containing NAME,
      - NAME is imported via a single-type-import declaration,
      - NAME is declared in an another compilation unit of the package
        of the compilation unit containing NAME,
      - NAME is declared by exactly on type-import-on-demand declaration
-     of the compilation unit containing NAME. */
-  else if ((decl = resolve_and_layout (name, NULL_TREE)))
+     of the compilation unit containing NAME. 
+     - NAME is actually a STRING_CST. */
+  else if (TREE_CODE (name) == STRING_CST ||
+	   (decl = resolve_and_layout (name, NULL_TREE)))
     {
       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]