diff options
author | Per Bothner <per@bothner.com> | 2001-04-26 11:32:22 -0700 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2001-04-26 11:32:22 -0700 |
commit | 8789b9fa5c893b2eefb47acb5ec84eb46128b057 (patch) | |
tree | e624daa90013162473950afc7f26bad2458e20b3 /gcc/java/jcf-write.c | |
parent | 5acea42bfb17b59aff01ce77fe63d880b4ef5878 (diff) | |
download | gcc-8789b9fa5c893b2eefb47acb5ec84eb46128b057.zip gcc-8789b9fa5c893b2eefb47acb5ec84eb46128b057.tar.gz gcc-8789b9fa5c893b2eefb47acb5ec84eb46128b057.tar.bz2 |
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
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r-- | gcc/java/jcf-write.c | 28 |
1 files changed, 14 insertions, 14 deletions
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 (); |