OSDN Git Service

* jcf-write.c (generate_bytecode_insns case SWITCH_EXPR):
authorbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2001 18:32:22 +0000 (18:32 +0000)
committerbothner <bothner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2001 18:32:22 +0000 (18:32 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41601 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/constants.c
gcc/java/java-tree.h
gcc/java/jcf-write.c

index 1f8fd67..b9bef8a 100644 (file)
@@ -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,
index 59b8c4f..c51cec9 100644 (file)
@@ -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);
index 65e7956..9d62ef3 100644 (file)
@@ -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));
index 3e000da..5ff0fe2 100644 (file)
@@ -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 ();