diff options
author | Alexandre Petit-Bianco <apbianco@cygnus.com> | 2000-02-21 23:53:36 +0000 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-02-21 15:53:36 -0800 |
commit | 2a1ed9c1118c22234087b5044d794cf526eccdc7 (patch) | |
tree | 424b297b151611bab940b1e6ad26e5096b801614 /gcc/java/jcf-write.c | |
parent | 47ee9bcb614d58ea60d228bb11563d7df4d279ec (diff) | |
download | gcc-2a1ed9c1118c22234087b5044d794cf526eccdc7.zip gcc-2a1ed9c1118c22234087b5044d794cf526eccdc7.tar.gz gcc-2a1ed9c1118c22234087b5044d794cf526eccdc7.tar.bz2 |
[multiple changes]
Thu Feb 17 14:30:37 2000 Alexandre Petit-Bianco <apbianco@cygnus.com>
* jcf-write.c (generate_bytecode_insns): Don't generate empty
`finally' clauses.
Thu Feb 17 13:20:58 2000 Alexandre Petit-Bianco <apbianco@cygnus.com>
* jcf-parse.c (load_class): Call `fatal' if no file containing
the target class are found.
From-SVN: r32095
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r-- | gcc/java/jcf-write.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 615697d..45552d3 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -2297,31 +2297,52 @@ generate_bytecode_insns (exp, target, state) break; case TRY_FINALLY_EXPR: { + struct jcf_block *finished_label, *finally_label, *start_label; + struct jcf_handler *handler; + int worthwhile_finally = 1; tree try_block = TREE_OPERAND (exp, 0); tree finally = TREE_OPERAND (exp, 1); - struct jcf_block *finished_label = gen_jcf_label (state); - struct jcf_block *finally_label = gen_jcf_label (state); - struct jcf_block *start_label = get_jcf_label_here (state); - tree return_link = build_decl (VAR_DECL, NULL_TREE, - return_address_type_node); - tree exception_type = build_pointer_type (throwable_type_node); - tree exception_decl = build_decl (VAR_DECL, NULL_TREE, exception_type); - struct jcf_handler *handler; + tree return_link, exception_type, exception_decl; - finally_label->pc = PENDING_CLEANUP_PC; - finally_label->next = state->labeled_blocks; - state->labeled_blocks = finally_label; - state->num_finalizers++; + /* If the finally clause happens to be empty, set a flag so we + remember to just skip it. */ + if (BLOCK_EXPR_BODY (finally) == empty_stmt_node) + worthwhile_finally = 0; + + if (worthwhile_finally) + { + return_link = build_decl (VAR_DECL, NULL_TREE, + return_address_type_node); + exception_type = build_pointer_type (throwable_type_node); + exception_decl = build_decl (VAR_DECL, NULL_TREE, exception_type); + + finished_label = gen_jcf_label (state); + finally_label = gen_jcf_label (state); + start_label = get_jcf_label_here (state); + finally_label->pc = PENDING_CLEANUP_PC; + finally_label->next = state->labeled_blocks; + state->labeled_blocks = finally_label; + state->num_finalizers++; + } generate_bytecode_insns (try_block, target, state); - if (state->labeled_blocks != finally_label) - abort(); - state->labeled_blocks = finally_label->next; - emit_jsr (finally_label, state); + + if (worthwhile_finally) + { + if (state->labeled_blocks != finally_label) + abort(); + state->labeled_blocks = finally_label->next; + emit_jsr (finally_label, state); + } + if (CAN_COMPLETE_NORMALLY (try_block)) emit_goto (finished_label, state); /* Handle exceptions. */ + + if (!worthwhile_finally) + break; + localvar_alloc (return_link, state); handler = alloc_handler (start_label, NULL_PTR, state); handler->end_label = handler->handler_label; |