Commit aedcdb65 by Per Bothner Committed by Per Bothner

decl.c (complete_start_java_method): Now generate TRY_FINALLY_EXPR instead of…

decl.c (complete_start_java_method): Now generate TRY_FINALLY_EXPR instead of CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR.


	* decl.c (complete_start_java_method):  Now generate TRY_FINALLY_EXPR
	instead of CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR.
	* jcf-write.c (generate_bytecode_insns):  Remove support for
	CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR as they are no longer used.
	* check-init.c (check_init):  Likewise.

From-SVN: r47587
parent 3acc0e76
2001-12-03 Per Bothner <per@bothner.com> 2001-12-03 Per Bothner <per@bothner.com>
* decl.c (complete_start_java_method): Now generate TRY_FINALLY_EXPR
instead of CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR.
* jcf-write.c (generate_bytecode_insns): Remove support for
CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR as they are no longer used.
* check-init.c (check_init): Likewise.
2001-12-03 Per Bothner <per@bothner.com>
* verify.c (subroutine_nesting): New function. * verify.c (subroutine_nesting): New function.
(verify_jvm_instructions): Use it to fix logic for checking that (verify_jvm_instructions): Use it to fix logic for checking that
we're done with the current subroutine. we're done with the current subroutine.
......
...@@ -529,29 +529,6 @@ check_init (exp, before) ...@@ -529,29 +529,6 @@ check_init (exp, before)
break; break;
} }
case CLEANUP_POINT_EXPR:
{
struct alternatives alt;
BEGIN_ALTERNATIVES (before, alt);
CLEAR_ALL (alt.combined);
check_init (TREE_OPERAND (exp, 0), before);
UNION (alt.combined, alt.combined, before);
END_ALTERNATIVES (before, alt);
}
return;
case WITH_CLEANUP_EXPR:
{
struct alternatives *alt = alternatives;
#ifdef ENABLE_JC1_CHECKING
if (TREE_CODE (alt->block) != CLEANUP_POINT_EXPR)
abort ();
#endif
check_init (TREE_OPERAND (exp, 0), before);
UNION (alt->combined, alt->combined, before);
check_init (TREE_OPERAND (exp, 1), alt->combined);
return;
}
case TRY_EXPR: case TRY_EXPR:
{ {
tree try_clause = TREE_OPERAND (exp, 0); tree try_clause = TREE_OPERAND (exp, 0);
......
...@@ -1714,12 +1714,9 @@ complete_start_java_method (fndecl) ...@@ -1714,12 +1714,9 @@ complete_start_java_method (fndecl)
{ {
tree function_body = DECL_FUNCTION_BODY (fndecl); tree function_body = DECL_FUNCTION_BODY (fndecl);
tree body = BLOCK_EXPR_BODY (function_body); tree body = BLOCK_EXPR_BODY (function_body);
lock = build (WITH_CLEANUP_EXPR, void_type_node, lock = build (COMPOUND_EXPR, void_type_node,
enter, exit, NULL_TREE); enter,
TREE_SIDE_EFFECTS (lock) = 1; build (TRY_FINALLY_EXPR, void_type_node, body, exit));
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; TREE_SIDE_EFFECTS (lock) = 1;
BLOCK_EXPR_BODY (function_body) = lock; BLOCK_EXPR_BODY (function_body) = lock;
} }
......
...@@ -112,7 +112,7 @@ struct jcf_block ...@@ -112,7 +112,7 @@ struct jcf_block
{ {
/* For blocks that that are defined, the next block (in pc order). /* For blocks that that are defined, the next block (in pc order).
For blocks that are not-yet-defined the end label of a LABELED_BLOCK_EXPR For blocks that are not-yet-defined the end label of a LABELED_BLOCK_EXPR
or a cleanup expression (from a WITH_CLEANUP_EXPR), or a cleanup expression (from a TRY_FINALLY_EXPR),
this is the next (outer) such end label, in a stack headed by this is the next (outer) such end label, in a stack headed by
labeled_blocks in jcf_partial. */ labeled_blocks in jcf_partial. */
struct jcf_block *next; struct jcf_block *next;
...@@ -1348,7 +1348,7 @@ generate_bytecode_conditional (exp, true_label, false_label, ...@@ -1348,7 +1348,7 @@ generate_bytecode_conditional (exp, true_label, false_label,
abort (); abort ();
} }
/* Call pending cleanups i.e. those for surrounding CLEANUP_POINT_EXPRs /* Call pending cleanups i.e. those for surrounding TRY_FINAL_EXPRs.
but only as far out as LIMIT (since we are about to jump to the but only as far out as LIMIT (since we are about to jump to the
emit label that is LIMIT). */ emit label that is LIMIT). */
...@@ -2279,78 +2279,6 @@ generate_bytecode_insns (exp, target, state) ...@@ -2279,78 +2279,6 @@ generate_bytecode_insns (exp, target, state)
} }
break; break;
case CLEANUP_POINT_EXPR:
{
struct jcf_block *save_labeled_blocks = state->labeled_blocks;
int can_complete = CAN_COMPLETE_NORMALLY (TREE_OPERAND (exp, 0));
generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state);
if (target != IGNORE_TARGET)
abort ();
while (state->labeled_blocks != save_labeled_blocks)
{
struct jcf_block *finished_label = NULL;
tree return_link;
tree exception_type = build_pointer_type (throwable_type_node);
tree exception_decl = build_decl (VAR_DECL, NULL_TREE,
exception_type);
struct jcf_block *end_label = get_jcf_label_here (state);
struct jcf_block *label = state->labeled_blocks;
struct jcf_handler *handler;
tree cleanup = label->u.labeled_block;
state->labeled_blocks = label->next;
state->num_finalizers--;
if (can_complete)
{
finished_label = gen_jcf_label (state);
emit_jsr (label, state);
emit_goto (finished_label, state);
if (! CAN_COMPLETE_NORMALLY (cleanup))
can_complete = 0;
}
handler = alloc_handler (label->v.start_label, end_label, state);
handler->type = NULL_TREE;
localvar_alloc (exception_decl, state);
NOTE_PUSH (1);
emit_store (exception_decl, state);
emit_jsr (label, state);
emit_load (exception_decl, state);
RESERVE (1);
OP1 (OPCODE_athrow);
NOTE_POP (1);
/* The finally block. */
return_link = build_decl (VAR_DECL, NULL_TREE,
return_address_type_node);
define_jcf_label (label, state);
NOTE_PUSH (1);
localvar_alloc (return_link, state);
emit_store (return_link, state);
generate_bytecode_insns (cleanup, IGNORE_TARGET, state);
maybe_wide (OPCODE_ret, DECL_LOCAL_INDEX (return_link), state);
localvar_free (return_link, state);
localvar_free (exception_decl, state);
if (finished_label != NULL)
define_jcf_label (finished_label, state);
}
}
break;
case WITH_CLEANUP_EXPR:
{
struct jcf_block *label;
generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state);
label = gen_jcf_label (state);
label->pc = PENDING_CLEANUP_PC;
label->next = state->labeled_blocks;
state->labeled_blocks = label;
state->num_finalizers++;
label->u.labeled_block = TREE_OPERAND (exp, 1);
label->v.start_label = get_jcf_label_here (state);
if (target != IGNORE_TARGET)
abort ();
}
break;
case TRY_EXPR: case TRY_EXPR:
{ {
tree try_clause = TREE_OPERAND (exp, 0); tree try_clause = TREE_OPERAND (exp, 0);
...@@ -2383,6 +2311,7 @@ generate_bytecode_insns (exp, target, state) ...@@ -2383,6 +2311,7 @@ generate_bytecode_insns (exp, target, state)
define_jcf_label (finished_label, state); define_jcf_label (finished_label, state);
} }
break; break;
case TRY_FINALLY_EXPR: case TRY_FINALLY_EXPR:
{ {
struct jcf_block *finished_label, struct jcf_block *finished_label,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment