PATCH jc1: fix synchronized, float->int conversion

Per Bothner bothner@cygnus.com
Fri Feb 26 14:45:00 GMT 1999


I've checked these into egcs.

	--Per Bothner
Cygnus Solutions     bothner@cygnus.com     http://www.cygnus.com/~bothner

Fri Feb 26 14:06:21 1999  Per Bothner  <bothner@cygnus.com>

	* typeck.c (convert_ieee_real_to_integer):  Use save_expr instead of
	explicit build_decl.  (Avoids crash in reload when optimizing.)

Thu Feb 25 21:05:04 1999  Per Bothner  <bothner@cygnus.com>

	* decl.c (complete_start_java_method):  Handle synchronized method
	even when compiling from bytecode.

Index: typeck.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/java/typeck.c,v
retrieving revision 1.42
diff -u -p -r1.42 typeck.c
--- typeck.c	1999/02/19 22:59:24	1.42
+++ typeck.c	1999/02/26 22:36:08
@@ -67,23 +67,12 @@ convert_ieee_real_to_integer (type, expr
      tree type, expr;
 {
   tree node, assignment, expr_decl;
+  expr = save_expr (expr);
 
-  expr_decl = build_decl (VAR_DECL, generate_name (), TREE_TYPE (expr));
-  layout_decl (expr_decl, 0);
-  expand_decl (pushdecl (expr_decl));
-  assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr);
-  TREE_SIDE_EFFECTS (assignment) = 1;
-  TREE_TYPE (assignment) = type;
-
-  expr = build (COMPOUND_EXPR, NULL_TREE,
-		assignment,
-		build (COND_EXPR, type, 
-		       build (NE_EXPR, boolean_type_node, expr_decl, expr_decl),
-		       build_int_2 (0, 0),
-		       convert_to_integer (type, expr_decl)));
-
-  TREE_TYPE (expr) = type;
-  return expr;
+  return build (COND_EXPR, type, 
+		build (NE_EXPR, boolean_type_node, expr, expr),
+		convert (type, integer_zero_node),
+		convert_to_integer (type, expr));
 }  
 
 /* Create an expression whose value is that of EXPR,
Index: decl.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/java/decl.c,v
retrieving revision 1.67
diff -u -p -r1.67 decl.c
--- decl.c	1999/02/21 23:47:59	1.67
+++ decl.c	1999/02/26 22:36:08
@@ -1514,12 +1514,19 @@ complete_start_java_method (fndecl)
       expand_expr_stmt (init);
     }
 
-  if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files
-      && DECL_FUNCTION_BODY (fndecl) != NULL_TREE)
+  /* Push local variables. Function compiled from source code are
+     using a different local variables management, and for them,
+     pushlevel shouldn't be called from here.  */
+  if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
     {
+      pushlevel (2);
+      if (! flag_emit_class_files)
+	expand_start_bindings (1);
+    }
+
+  if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files)
+    {
       /* Warp function body with a monitorenter plus monitorexit cleanup. */
-      tree function_body = DECL_FUNCTION_BODY (fndecl);
-      tree body = BLOCK_EXPR_BODY (function_body);
       tree enter, exit, lock;
       if (METHOD_STATIC (fndecl))
 	lock = build_class_ref (DECL_CONTEXT (fndecl));
@@ -1527,24 +1534,24 @@ complete_start_java_method (fndecl)
 	lock = DECL_ARGUMENTS (fndecl);
       BUILD_MONITOR_ENTER (enter, lock);
       BUILD_MONITOR_EXIT (exit, lock);
-      lock = build (WITH_CLEANUP_EXPR, void_type_node,
-		    enter,  NULL_TREE, exit);
-      TREE_SIDE_EFFECTS (lock) = 1;
-      lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
-      TREE_SIDE_EFFECTS (lock) = 1;
-      lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
-      TREE_SIDE_EFFECTS (lock) = 1;
-      BLOCK_EXPR_BODY (function_body) = lock;
-    }
-
-  /* Push local variables. Function compiled from source code are
-     using a different local variables management, and for them,
-     pushlevel shouldn't be called from here.  */
-  if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
-    {
-      pushlevel (2);
-      if (! flag_emit_class_files)
-	expand_start_bindings (1);
+      if (!CLASS_FROM_SOURCE_P (DECL_CONTEXT (fndecl)))
+	{
+	  expand_expr_stmt (enter);
+	  expand_decl_cleanup (NULL_TREE, exit);
+	}
+      else
+	{
+	  tree function_body = DECL_FUNCTION_BODY (fndecl);
+	  tree body = BLOCK_EXPR_BODY (function_body);
+	  lock = build (WITH_CLEANUP_EXPR, void_type_node,
+			enter,  NULL_TREE, exit);
+	  TREE_SIDE_EFFECTS (lock) = 1;
+	  lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body);
+	  TREE_SIDE_EFFECTS (lock) = 1;
+	  lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock);
+	  TREE_SIDE_EFFECTS (lock) = 1;
+	  BLOCK_EXPR_BODY (function_body) = lock;
+	}
     }
 }
 


More information about the Gcc-patches mailing list