diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 14b8ece1367..707fa3c9dc3 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -1514,29 +1514,6 @@ complete_start_java_method (fndecl) expand_expr_stmt (init); } - if (METHOD_SYNCHRONIZED (fndecl) && ! flag_emit_class_files - && DECL_FUNCTION_BODY (fndecl) != NULL_TREE) - { - /* 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)); - else - 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. */ @@ -1546,6 +1523,36 @@ complete_start_java_method (fndecl) 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 enter, exit, lock; + if (METHOD_STATIC (fndecl)) + lock = build_class_ref (DECL_CONTEXT (fndecl)); + else + lock = DECL_ARGUMENTS (fndecl); + BUILD_MONITOR_ENTER (enter, lock); + BUILD_MONITOR_EXIT (exit, lock); + 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; + } + } } void diff --git a/gcc/java/typeck.c b/gcc/java/typeck.c index 8d99fd82250..1d544e66ad4 100644 --- a/gcc/java/typeck.c +++ b/gcc/java/typeck.c @@ -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,