Commit 8789b9fa by Per Bothner Committed by Per Bothner

jcf-write.c (generate_bytecode_insns case SWITCH_EXPR): Fix thinko: If a single…

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
parent 5acea42b
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> 2001-04-25 Per Bothner <per@bothner.com>
* verify.c (verify_jvm_instructions): For field instructions, * verify.c (verify_jvm_instructions): For field instructions,
......
...@@ -197,7 +197,15 @@ find_methodref_index (cpool, decl) ...@@ -197,7 +197,15 @@ find_methodref_index (cpool, decl)
CPool *cpool; CPool *cpool;
tree decl; 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); int class_index = find_class_constant (cpool, mclass);
tree name = DECL_CONSTRUCTOR_P (decl) ? init_identifier_node tree name = DECL_CONSTRUCTOR_P (decl) ? init_identifier_node
: DECL_NAME (decl); : DECL_NAME (decl);
......
...@@ -1099,6 +1099,7 @@ extern int find_string_constant PARAMS ((struct CPool *, tree)); ...@@ -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_class_constant PARAMS ((struct CPool *, tree));
extern int find_fieldref_index 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_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 void write_constant_pool PARAMS ((struct CPool *, unsigned char *, int));
extern int count_constant_pool_bytes PARAMS ((struct CPool *)); extern int count_constant_pool_bytes PARAMS ((struct CPool *));
extern int encode_newarray_type PARAMS ((tree)); extern int encode_newarray_type PARAMS ((tree));
......
...@@ -1721,7 +1721,7 @@ generate_bytecode_insns (exp, target, state) ...@@ -1721,7 +1721,7 @@ generate_bytecode_insns (exp, target, state)
{ {
push_int_const (sw_state.cases->offset, state); push_int_const (sw_state.cases->offset, state);
emit_if (sw_state.cases->label, 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); emit_goto (sw_state.default_label, state);
} }
...@@ -2547,7 +2547,7 @@ generate_bytecode_insns (exp, target, state) ...@@ -2547,7 +2547,7 @@ generate_bytecode_insns (exp, target, state)
NOTE_POP (1); /* Pop implicit this. */ NOTE_POP (1); /* Pop implicit this. */
if (TREE_CODE (f) == FUNCTION_DECL && DECL_CONTEXT (f) != NULL_TREE) 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; int index, interface = 0;
RESERVE (5); RESERVE (5);
if (METHOD_STATIC (f)) if (METHOD_STATIC (f))
...@@ -2555,24 +2555,24 @@ generate_bytecode_insns (exp, target, state) ...@@ -2555,24 +2555,24 @@ generate_bytecode_insns (exp, target, state)
else if (DECL_CONSTRUCTOR_P (f) || CALL_USING_SUPER (exp) else if (DECL_CONSTRUCTOR_P (f) || CALL_USING_SUPER (exp)
|| METHOD_PRIVATE (f)) || METHOD_PRIVATE (f))
OP1 (OPCODE_invokespecial); OP1 (OPCODE_invokespecial);
else if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (f))))
{
OP1 (OPCODE_invokeinterface);
interface = 1;
}
else else
OP1 (OPCODE_invokevirtual);
if (interface)
{ {
saved_context = DECL_CONTEXT (f); if (CLASS_INTERFACE (TYPE_NAME (context)))
DECL_CONTEXT (f) = {
TREE_TYPE (TREE_TYPE (TREE_VALUE (TREE_OPERAND (exp, 1)))); 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); OP2 (index);
if (interface) if (interface)
{ {
DECL_CONTEXT (f) = saved_context;
if (nargs <= 0) if (nargs <= 0)
abort (); abort ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment