From 8789b9fa5c893b2eefb47acb5ec84eb46128b057 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Thu, 26 Apr 2001 11:32:22 -0700 Subject: [PATCH] jcf-write.c (generate_bytecode_insns case SWITCH_EXPR): Fix thinko: If a single case, use if_icmpeq, not ifeq. * 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. From-SVN: r41601 --- gcc/java/ChangeLog | 12 ++++++++++++ gcc/java/constants.c | 10 +++++++++- gcc/java/java-tree.h | 1 + gcc/java/jcf-write.c | 28 ++++++++++++++-------------- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 1f8fd67c9f3..b9bef8a6cb9 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,15 @@ +2001-04-26 Per Bothner + + * 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 * verify.c (verify_jvm_instructions): For field instructions, diff --git a/gcc/java/constants.c b/gcc/java/constants.c index 59b8c4f16c4..c51cec9a7a4 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 65e7956ee7a..9d62ef3cff9 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 3e000daec34..5ff0fe2775b 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 (); -- 2.30.2