diff options
author | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-12-06 10:55:42 -0800 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 2000-12-06 10:55:42 -0800 |
commit | c7303e411e27224a555ee8fae64bb421c26425cf (patch) | |
tree | bab5cce64b7453c82f9667ebeaae7027f855769d /gcc/java/jcf-write.c | |
parent | ee4570050a9b98deda6ec035906037a9e39c8335 (diff) | |
download | gcc-c7303e411e27224a555ee8fae64bb421c26425cf.zip gcc-c7303e411e27224a555ee8fae64bb421c26425cf.tar.gz gcc-c7303e411e27224a555ee8fae64bb421c26425cf.tar.bz2 |
[multiple changes]
2000-10-18 Alexandre Petit-Bianco <apbianco@cygnus.com>
* jcf-write.c (OP1): Update `last_bc'.
(struct jcf_block): Fixed indentation and typo in comments. New
field `last_bc'.
(generate_bytecode_insns): Insert `nop' if `jsr' immediately
follows `monitorenter'.
* parse.y (patch_synchronized_statement): New local `tmp'. Call
`patch_string'.
Fixes gcj/232.
2000-10-13 Alexandre Petit-Bianco <apbianco@cygnus.com>
* check-init.c (check_init): Fixed leading comment. Use
LOCAL_FINAL_P.
* decl.c (push_jvm_slot): Use MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC.
(give_name_to_locals): Likewise.
(lang_mark_tree): Handle FIELD_DECL. Register `am' and `wfl'
fields in lang_decl_var.
* java-tree.h (DECL_FUNCTION_SYNTHETIC_CTOR,
DECL_FUNCTION_ALL_FINAL_INITIALIZED): New macros.
(FIELD_INNER_ACCESS): Removed ugly cast, macro rewritten.
(FIELD_INNER_ACCESS_P, DECL_FIELD_FINAL_IUD, DECL_FIELD_FINAL_LIIC,
DECL_FIELD_FINAL_IERR, DECL_FIELD_FINAL_WFL): New macros.
(LOCAL_FINAL): Rewritten.
(LOCAL_FINAL_P, FINAL_VARIABLE_P, CLASS_FINAL_VARIABLE_P
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC): New macros.
(struct lang_decl): Fixed comments. Added `synthetic_ctor' and
`init_final' fields.
(struct lang_decl_var): Fixed leading comment. Added `am', `wfl',
`final_uid', `final_liic', `final_ierr' and `local_final' fields.
(TYPE_HAS_FINAL_VARIABLE): New macro.
(struct lang_type): Added `afv' field.
* parse.y (check_static_final_variable_assignment_flag): New function.
(reset_static_final_variable_assignment_flag): Likewise.
(check_final_variable_local_assignment_flag): Likewise.
(reset_final_variable_local_assignment_flag): Likewise.
(check_final_variable_indirect_assignment): Likewise.
(check_final_variable_global_assignment_flag): Likewise.
(add_inner_class_fields): Use LOCAL_FINAL_P.
(register_fields): Handle local finals and final variables.
(craft_constructor): Set DECL_FUNCTION_SYNTHETIC_CTOR.
(declare_local_variables): Call MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC.
(source_start_java_method): Call MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC
on local finals.
(java_complete_expand_methods): Loop to set
TYPE_HAS_FINAL_VARIABLE. Call
`reset_final_variable_local_assignment_flag' and
`check_final_variable_local_assignment_flag' accordingly before
and after constructor expansion. Call
`reset_static_final_variable_assignment_flag'
before expanding <clinit> and after call
`check_static_final_variable_assignment_flag' if the
current_class isn't an interface. After all methods have been
expanded, call `check_final_variable_global_assignment_flag' and
`check_static_final_variable_assignment_flag' if the current class
is an interface.
(maybe_yank_clinit): Fixed typo in comment.
(build_outer_field_access_methods): Removed old sanity check. Use
FIELD_INNER_ACCESS_P. Call MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC.
Don't create access methods for finals.
(resolve_field_access): Use `CLASS_FINAL_VARIABLE_P'.
(java_complete_tree): Likewise. Reset DECL_FIELD_FINAL_IUD if
existing DECL_INIT has been processed.
(java_complete_lhs): Likewise.
(check_final_assignment): Filter input on `lvalue''s TREE_CODE.
Test for COMPONENT_REF to get to the FIELD_DECL. Implemented new
logic.
(patch_assignment): Use LOCAL_FINAL_P.
(fold_constant_for_init): Reset DECL_FIELD_FINAL_IUD if
DECL_INITIAL is nullified.
Fixes gcj/163.
2000-10-09 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (pop_current_osb): New function.
(array_type:): Use `dims:', changed actions
accordingly. Suggested by Anthony Green.
(array_creation_expression:): Used pop_current_osb.
(cast_expression:): Likewise.
(search_applicable_method_list): Fixed indentation.
2000-10-08 Anthony Green <green@redhat.com>
* parse.y (array_type_literal): Remove production.
(type_literals): Refer to array_type, not array_type_literal.
(http://gcc.gnu.org/ml/gcc-patches/2000-12/msg00317.html)
From-SVN: r38070
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r-- | gcc/java/jcf-write.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index e08b37d..b66db93 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -57,7 +57,7 @@ char *jcf_write_base_directory = NULL; /* Add a 1-byte instruction/operand I to bytecode.data, assuming space has already been RESERVE'd. */ -#define OP1(I) (*state->bytecode.ptr++ = (I), CHECK_OP(state)) +#define OP1(I) (state->last_bc = *state->bytecode.ptr++ = (I), CHECK_OP(state)) /* Like OP1, but I is a 2-byte big endian integer. */ @@ -131,13 +131,14 @@ struct jcf_block int linenumber; - /* After finish_jcf_block is called, The actual instructions contained in this block. - Before than NULL, and the instructions are in state->bytecode. */ + /* After finish_jcf_block is called, The actual instructions + contained in this block. Before than NULL, and the instructions + are in state->bytecode. */ union { struct chunk *chunk; /* If pc==PENDING_CLEANUP_PC, start_label is the start of the region - coveed by the cleanup. */ + covered by the cleanup. */ struct jcf_block *start_label; } v; @@ -272,8 +273,10 @@ struct jcf_partial /* If non-NULL, use this for the return value. */ tree return_value_decl; - /* Information about the current switch statemenet. */ + /* Information about the current switch statement. */ struct jcf_switch_state *sw_state; + + enum java_opcode last_bc; /* The last emitted bytecode */ }; static void generate_bytecode_insns PARAMS ((tree, int, struct jcf_partial *)); @@ -2158,7 +2161,16 @@ generate_bytecode_insns (exp, target, state) tree src = TREE_OPERAND (exp, 0); tree src_type = TREE_TYPE (src); tree dst_type = TREE_TYPE (exp); - generate_bytecode_insns (TREE_OPERAND (exp, 0), target, state); + /* Detect the situation of compiling an empty synchronized + block. A nop should be emitted in order to produce + verifiable bytecode. */ + if (exp == empty_stmt_node + && state->last_bc == OPCODE_monitorenter + && state->labeled_blocks + && state->labeled_blocks->pc == PENDING_CLEANUP_PC) + OP1 (OPCODE_nop); + else + generate_bytecode_insns (TREE_OPERAND (exp, 0), target, state); if (target == IGNORE_TARGET || src_type == dst_type) break; if (TREE_CODE (dst_type) == POINTER_TYPE) |