summaryrefslogtreecommitdiff
path: root/libjava/verify.cc
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-19 07:08:36 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-19 07:08:36 +0000
commit629b3566e16e6e48db7762cff517bfdcc5583bed (patch)
treeffae3bbbb68e0f88dec21fdae51b13c8b1584b17 /libjava/verify.cc
parent25037517df7782dbe35170dbe7864ddd9e2c4c9a (diff)
downloadgcc-629b3566e16e6e48db7762cff517bfdcc5583bed.tar.gz
* verify.cc (type::to_array): New method.
(_Jv_BytecodeVerifier::verify_instructions_0) [op_anewarray]: Construct new array type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47165 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/verify.cc')
-rw-r--r--libjava/verify.cc19
1 files changed, 18 insertions, 1 deletions
diff --git a/libjava/verify.cc b/libjava/verify.cc
index 423edaa1609..8c290a38d28 100644
--- a/libjava/verify.cc
+++ b/libjava/verify.cc
@@ -491,6 +491,23 @@ private:
return type (k);
}
+ // Return the array type corresponding to an initialized
+ // reference. We could expand this to work for other kinds of
+ // types, but currently we don't need to.
+ type to_array ()
+ {
+ // Resolving isn't ideal, because it might force us to load
+ // another class, but it's easy. FIXME?
+ if (key == unresolved_reference_type)
+ resolve ();
+
+ if (key == reference_type)
+ return type (_Jv_GetArrayClass (data.klass,
+ data.klass->getClassLoader ()));
+ else
+ verify_fail ("internal error in type::to_array()");
+ }
+
bool isreference () const
{
return key >= reference_type;
@@ -2426,7 +2443,7 @@ private:
break;
case op_anewarray:
pop_type (int_type);
- push_type (check_class_constant (get_ushort ()));
+ push_type (check_class_constant (get_ushort ()).to_array ());
break;
case op_arraylength:
{