OSDN Git Service

authorbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Feb 1999 14:43:29 +0000 (14:43 +0000)
committerbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Feb 1999 14:43:29 +0000 (14:43 +0000)
* typeck.c (convert_ieee_real_to_integer):  Use save_expr instead of
explicit build_decl.  (Avoids crash in reload when optimizing.)
* decl.c (complete_start_java_method):  Handle synchronized method
even when compiling from bytecode.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25468 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/decl.c
gcc/java/typeck.c

index 14b8ece..707fa3c 100644 (file)
@@ -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;
+       }
     }
 }
 
index 8d99fd8..1d544e6 100644 (file)
@@ -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,