From: Tom Tromey Date: Mon, 19 Nov 2001 07:08:36 +0000 (+0000) Subject: verify.cc (type::to_array): New method. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d68e5f555d11826aab75b63d0dbcff85a2b425f1;p=gcc.git verify.cc (type::to_array): New method. * verify.cc (type::to_array): New method. (_Jv_BytecodeVerifier::verify_instructions_0) [op_anewarray]: Construct new array type. From-SVN: r47165 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 39670efbf7b..af02f3ecf6d 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,9 @@ 2001-11-18 Tom Tromey + * verify.cc (type::to_array): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_anewarray]: + Construct new array type. + * verify.cc (_Jv_BytecodeVerifier::branch_prepass) [op_sipush]: Skip a short, not a byte. [op_newarray]: Skip a byte, not a short. 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: {