diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/java/constants.c | 10 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 1 | ||||
-rw-r--r-- | gcc/java/jcf-write.c | 28 |
4 files changed, 36 insertions, 15 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 1f8fd67..b9bef8a 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,15 @@ +2001-04-26 Per Bothner <per@bothner.com> + + * jcf-write.c (generate_bytecode_insns case SWITCH_EXPR): + Fix thinko: If a single case, use if_icmpeq, not ifeq. + + * constants.c (find_methodref_with_class_index): New function. + (find_methodref_index): Use find_methodref_with_class_index. + * java-tree.h (find_methodref_with_class_index): New declaration. + * jcf-write.c (generate_bytecode_insns case CALL_EXPR): Don't change + DECL_CONTEXT, instead use new find_methodref_with_class_index function. + If context changed from interface to class, don't use invokeinterface. + 2001-04-25 Per Bothner <per@bothner.com> * verify.c (verify_jvm_instructions): For field instructions, diff --git a/gcc/java/constants.c b/gcc/java/constants.c index 59b8c4f..c51cec9 100644 --- a/gcc/java/constants.c +++ b/gcc/java/constants.c @@ -197,7 +197,15 @@ find_methodref_index (cpool, decl) CPool *cpool; tree decl; { - tree mclass = DECL_CONTEXT (decl); + return find_methodref_with_class_index (cpool, decl, DECL_CONTEXT (decl)); +} + +int +find_methodref_with_class_index (cpool, decl, mclass) + CPool *cpool; + tree decl; + tree mclass; +{ int class_index = find_class_constant (cpool, mclass); tree name = DECL_CONSTRUCTOR_P (decl) ? init_identifier_node : DECL_NAME (decl); diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 65e7956..9d62ef3 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1099,6 +1099,7 @@ extern int find_string_constant PARAMS ((struct CPool *, tree)); extern int find_class_constant PARAMS ((struct CPool *, tree)); extern int find_fieldref_index PARAMS ((struct CPool *, tree)); extern int find_methodref_index PARAMS ((struct CPool *, tree)); +extern int find_methodref_with_class_index PARAMS ((struct CPool *, tree, tree)); extern void write_constant_pool PARAMS ((struct CPool *, unsigned char *, int)); extern int count_constant_pool_bytes PARAMS ((struct CPool *)); extern int encode_newarray_type PARAMS ((tree)); diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index 3e000da..5ff0fe2 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -1721,7 +1721,7 @@ generate_bytecode_insns (exp, target, state) { push_int_const (sw_state.cases->offset, state); emit_if (sw_state.cases->label, - OPCODE_ifeq, OPCODE_ifne, state); + OPCODE_if_icmpeq, OPCODE_if_icmpne, state); } emit_goto (sw_state.default_label, state); } @@ -2547,7 +2547,7 @@ generate_bytecode_insns (exp, target, state) NOTE_POP (1); /* Pop implicit this. */ if (TREE_CODE (f) == FUNCTION_DECL && DECL_CONTEXT (f) != NULL_TREE) { - tree saved_context = NULL_TREE; + tree context = DECL_CONTEXT (f); int index, interface = 0; RESERVE (5); if (METHOD_STATIC (f)) @@ -2555,24 +2555,24 @@ generate_bytecode_insns (exp, target, state) else if (DECL_CONSTRUCTOR_P (f) || CALL_USING_SUPER (exp) || METHOD_PRIVATE (f)) OP1 (OPCODE_invokespecial); - else if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (f)))) - { - OP1 (OPCODE_invokeinterface); - interface = 1; - } else - OP1 (OPCODE_invokevirtual); - if (interface) { - saved_context = DECL_CONTEXT (f); - DECL_CONTEXT (f) = - TREE_TYPE (TREE_TYPE (TREE_VALUE (TREE_OPERAND (exp, 1)))); + if (CLASS_INTERFACE (TYPE_NAME (context))) + { + tree arg1 = TREE_VALUE (TREE_OPERAND (exp, 1)); + context = TREE_TYPE (TREE_TYPE (arg1)); + if (CLASS_INTERFACE (TYPE_NAME (context))) + interface = 1; + } + if (interface) + OP1 (OPCODE_invokeinterface); + else + OP1 (OPCODE_invokevirtual); } - index = find_methodref_index (&state->cpool, f); + index = find_methodref_with_class_index (&state->cpool, f, context); OP2 (index); if (interface) { - DECL_CONTEXT (f) = saved_context; if (nargs <= 0) abort (); |