Allow uses of interface types to verify.
authorPer Bothner <bothner@gcc.gnu.org>
Sat, 14 Nov 1998 17:22:22 +0000 (09:22 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Sat, 14 Nov 1998 17:22:22 +0000 (09:22 -0800)

Allow uses of interface types to verify.  This is not really
type-safe, but it matches what Sun does, and is OK as long as
there are appropriate run-time checks.
* verify.c (merge_types):  If merging two interface types,
just set the result to java.lang.Object.
* expr.c (pop_type):  Any interface is matches by java.lang.Object.

From-SVN: r23656

gcc/java/expr.c
gcc/java/verify.c

index 0df6106..9bd1ca7 100644 (file)
@@ -268,6 +268,12 @@ pop_type (type)
        return type;
       else if (can_widen_reference_to (t, type))
        return t;
+      /* This is a kludge, but matches what Sun's verifier does.
+        It can be tricked, but is safe as long as type errors
+        (i.e. interface method calls) are caught at run-time. */
+      else if (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (type)))
+              && t == object_ptr_type_node)
+       return t;
     }
   error ("unexpected type on stack");
   return t;
index d73c52a..9554a81 100644 (file)
@@ -150,6 +150,32 @@ merge_types (type1, type2)
            }
          return object_ptr_type_node;
        }
+
+      if (CLASS_INTERFACE (TYPE_NAME (tt1)))
+       {
+         if (CLASS_INTERFACE (TYPE_NAME (tt2)))
+           {
+             /* This is a kludge, but matches what Sun's verifier does.
+                It can be tricked, but is safe as long as type errors
+                (i.e. interface method calls) are caught at run-time. */
+             return object_ptr_type_node;
+           }
+         else
+           {
+             if (can_widen_reference_to (tt2, tt1))
+               return type1;
+             else
+               return TYPE_UNKNOWN;
+           }
+       }
+      else if (CLASS_INTERFACE (TYPE_NAME (tt2)))
+       {
+         if (can_widen_reference_to (tt1, tt2))
+           return type2;
+         else
+           return TYPE_UNKNOWN;
+       }
+
       type1 = tt1;
       type2 = tt2;