mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-19 05:09:10 +08:00
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:
parent
bd8dc16507
commit
46cf461c83
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user