mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-27 23:14:56 +08:00
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
This commit is contained in:
parent
5acea42bfb
commit
8789b9fa5c
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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 ();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user