Allow uses of interface types to verify.

�
	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
This commit is contained in:
Per Bothner 1998-11-14 09:22:22 -08:00
parent bd8dc16507
commit 46cf461c83
2 changed files with 32 additions and 0 deletions

View 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;

View 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;