Error Buddy

Do you have an error message from your application? Then find the answer with Error Buddy. You can search over 40000 source code files and troubleshooting documents using our beta lucene/nutch search interface or if you prefer, search as normal using google. With LXR technology you can drill right down into the line of source code where it came from with full cross-referencing.

If after searching you didn't get your ideal answer, or you are still unclear what the error means, you can choose to post that question to the community forums following the link included in the search results.

corestack/ gcc-3.3.3/ libjava/ verify.cc [1.6]
001 // defineclass.cc - defining a class from .class format.
002 
003 /* Copyright (C) 2001, 2002, 2003  Free Software Foundation
004 
005    This file is part of libgcj.
006 
007 This software is copyrighted work licensed under the terms of the
008 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
009 details.  */
010 
011 // Written by Tom Tromey <tromey@redhat.com>
012 
013 // Define VERIFY_DEBUG to enable debugging output.
014 
015 #include <config.h>
016 
017 #include <jvm.h>
018 #include <gcj/cni.h>
019 #include <java-insns.h>
020 #include <java-interp.h>
021 
022 #ifdef INTERPRETER
023 
024 #include <java/lang/Class.h>
025 #include <java/lang/VerifyError.h>
026 #include <java/lang/Throwable.h>
027 #include <java/lang/reflect/Modifier.h>
028 #include <java/lang/StringBuffer.h>
029 
030 #ifdef VERIFY_DEBUG
031 #include <stdio.h>
032 #endif /* VERIFY_DEBUG */
033 
034 
035 static void debug_print (const char *fmt, ...)
036   __attribute__ ((format (printf, 1, 2)));
037 
038 static inline void
039 debug_print (const char *fmt, ...)
040 {
041 #ifdef VERIFY_DEBUG
042   va_list ap;
043   va_start (ap, fmt);
044   vfprintf (stderr, fmt, ap);
045   va_end (ap);
046 #endif /* VERIFY_DEBUG */
047 }
048 
049 class _Jv_BytecodeVerifier
050 {
051 private:
052 
053   static const int FLAG_INSN_START = 1;
054   static const int FLAG_BRANCH_TARGET = 2;
055 
056   struct state;
057   struct type;
058   struct subr_info;
059   struct subr_entry_info;
060   struct linked_utf8;
061 
062   // The current PC.
063   int PC;
064   // The PC corresponding to the start of the current instruction.
065   int start_PC;
066 
067   // The current state of the stack, locals, etc.
068   state *current_state;
069 
070   // We store the state at branch targets, for merging.  This holds
071   // such states.
072   state **states;
073 
074   // We keep a linked list of all the PCs which we must reverify.
075   // The link is done using the PC values.  This is the head of the
076   // list.
077   int next_verify_pc;
078 
079   // We keep some flags for each instruction.  The values are the
080   // FLAG_* constants defined above.
081   char *flags;
082 
083   // We need to keep track of which instructions can call a given
084   // subroutine.  FIXME: this is inefficient.  We keep a linked list
085   // of all calling `jsr's at at each jsr target.
086   subr_info **jsr_ptrs;
087 
088   // We keep a linked list of entries which map each `ret' instruction
089   // to its unique subroutine entry point.  We expect that there won't
090   // be many `ret' instructions, so a linked list is ok.
091   subr_entry_info *entry_points;
092 
093   // The bytecode itself.
094   unsigned char *bytecode;
095   // The exceptions.
096   _Jv_InterpException *exception;
097 
098   // Defining class.
099   jclass current_class;
100   // This method.
101   _Jv_InterpMethod *current_method;
102 
103   // A linked list of utf8 objects we allocate.  This is really ugly,
104   // but without this our utf8 objects would be collected.
105   linked_utf8 *utf8_list;
106 
107   struct linked_utf8
108   {
109     _Jv_Utf8Const *val;
110     linked_utf8 *next;
111   };
112 
113   _Jv_Utf8Const *make_utf8_const (char *s, int len)
114   {
115     _Jv_Utf8Const *val = _Jv_makeUtf8Const (s, len);
116     _Jv_Utf8Const *r = (_Jv_Utf8Const *) _Jv_Malloc (sizeof (_Jv_Utf8Const)
117                                                      + val->length
118                                                      + 1);
119     r->length = val->length;
120     r->hash = val->hash;
121     memcpy (r->data, val->data, val->length + 1);
122 
123     linked_utf8 *lu = (linked_utf8 *) _Jv_Malloc (sizeof (linked_utf8));
124     lu->val = r;
125     lu->next = utf8_list;
126     utf8_list = lu;
127 
128     return r;
129   }
130 
131   __attribute__ ((__noreturn__)) void verify_fail (char *s, jint pc = -1)
132   {
133     using namespace java::lang;
134     StringBuffer *buf = new StringBuffer ();
135 
136     buf->append (JvNewStringLatin1 ("verification failed"));
137     if (pc == -1)
138       pc = start_PC;
139     if (pc != -1)
140       {
141         buf->append (JvNewStringLatin1 (" at PC "));
142         buf->append (pc);
143       }
144 
145     _Jv_InterpMethod *method = current_method;
146     buf->append (JvNewStringLatin1 (" in "));
147     buf->append (current_class->getName());
148     buf->append ((jchar) ':');
149     buf->append (JvNewStringUTF (method->get_method()->name->data));
150     buf->append ((jchar) '(');
151     buf->append (JvNewStringUTF (method->get_method()->signature->data));
152     buf->append ((jchar) ')');
153 
154     buf->append (JvNewStringLatin1 (": "));
155     buf->append (JvNewStringLatin1 (s));
156     throw new java::lang::VerifyError (buf->toString ());
157   }
158 
159   // This enum holds a list of tags for all the different types we
160   // need to handle.  Reference types are treated specially by the
161   // type class.
162   enum type_val
163   {
164     void_type,
165 
166     // The values for primitive types are chosen to correspond to values
167     // specified to newarray.
168     boolean_type = 4,
169     char_type = 5,
170     float_type = 6,
171     double_type = 7,
172     byte_type = 8,
173     short_type = 9,
174     int_type = 10,
175     long_type = 11,
176 
177     // Used when overwriting second word of a double or long in the
178     // local variables.  Also used after merging local variable states
179     // to indicate an unusable value.
180     unsuitable_type,
181     return_address_type,
182     continuation_type,
183 
184     // There is an obscure special case which requires us to note when
185     // a local variable has not been used by a subroutine.  See
186     // push_jump_merge for more information.
187     unused_by_subroutine_type,
188 
189     // Everything after `reference_type' must be a reference type.
190     reference_type,
191     null_type,
192     unresolved_reference_type,
193     uninitialized_reference_type,
194     uninitialized_unresolved_reference_type
195   };
196 
197   // Return the type_val corresponding to a primitive signature
198   // character.  For instance `I' returns `int.class'.
199   type_val get_type_val_for_signature (jchar sig)
200   {
201     type_val rt;
202     switch (sig)
203       {
204       case 'Z':
205         rt = boolean_type;
206         break;
207       case 'B':
208         rt = byte_type;
209         break;
210       case 'C':
211         rt = char_type;
212         break;
213       case 'S':
214         rt = short_type;
215         break;
216       case 'I':
217         rt = int_type;
218         break;
219       case 'J':
220         rt = long_type;
221         break;
222       case 'F':
223         rt = float_type;
224         break;
225       case 'D':
226         rt = double_type;
227         break;
228       case 'V':
229         rt = void_type;
230         break;
231       default:
232         verify_fail ("invalid signature");
233       }
234     return rt;
235   }
236 
237   // Return the type_val corresponding to a primitive class.
238   type_val get_type_val_for_signature (jclass k)
239   {
240     return get_type_val_for_signature ((jchar) k->method_count);
241   }
242 
243   // This is like _Jv_IsAssignableFrom, but it works even if SOURCE or
244   // TARGET haven't been prepared.
245   static bool is_assignable_from_slow (jclass target, jclass source)
246   {
247     // This will terminate when SOURCE==Object.
248     while (true)
249       {
250         if (source == target)
251           return true;
252 
253         if (target->isPrimitive () || source->isPrimitive ())
254           return false;
255 
256         if (target->isArray ())
257           {
258             if (! source->isArray ())
259               return false;
260             target = target->getComponentType ();
261             source = source->getComponentType ();
262           }
263         else if (target->isInterface ())
264           {
265             for (int i = 0; i < source->interface_count; ++i)
266               {
267                 // We use a recursive call because we also need to
268                 // check superinterfaces.
269                 if (is_assignable_from_slow (target, source->interfaces[i]))
270                     return true;
271               }
272             source = source->getSuperclass ();
273             if (source == NULL)
274               return false;
275           }
276         // We must do this check before we check to see if SOURCE is
277         // an interface.  This way we know that any interface is
278         // assignable to an Object.
279         else if (target == &java::lang::Object::class$)
280           return true;
281         else if (source->isInterface ())
282           {
283             for (int i = 0; i < target->interface_count; ++i)
284               {
285                 // We use a recursive call because we also need to
286                 // check superinterfaces.
287                 if (is_assignable_from_slow (target->interfaces[i], source))
288                   return true;
289               }
290             target = target->getSuperclass ();
291             if (target == NULL)
292               return false;
293           }
294         else if (source == &java::lang::Object::class$)
295           return false;
296         else
297           source = source->getSuperclass ();
298       }
299   }
300 
301   // This is used to keep track of which `jsr's correspond to a given
302   // jsr target.
303   struct subr_info
304   {
305     // PC of the instruction just after the jsr.
306     int pc;
307     // Link.
308     subr_info *next;
309   };
310 
311   // This is used to keep track of which subroutine entry point
312   // corresponds to which `ret' instruction.
313   struct subr_entry_info
314   {
315     // PC of the subroutine entry point.
316     int pc;
317     // PC of the `ret' instruction.
318     int ret_pc;
319     // Link.
320     subr_entry_info *next;
321   };
322 
323   // The `type' class is used to represent a single type in the
324   // verifier.
325   struct type
326   {
327     // The type.
328     type_val key;
329     // Some associated data.
330     union
331     {
332       // For a resolved reference type, this is a pointer to the class.
333       jclass klass;
334       // For other reference types, this it the name of the class.
335       _Jv_Utf8Const *name;
336     } data;
337     // This is used when constructing a new object.  It is the PC of the
338     // `new' instruction which created the object.  We use the special
339     // value -2 to mean that this is uninitialized, and the special
340     // value -1 for the case where the current method is itself the
341     // <init> method.
342     int pc;
343 
344     static const int UNINIT = -2;
345     static const int SELF = -1;
346 
347     // Basic constructor.
348     type ()
349     {
350       key = unsuitable_type;
351       data.klass = NULL;
352       pc = UNINIT;
353     }
354 
355     // Make a new instance given the type tag.  We assume a generic
356     // `reference_type' means Object.
357     type (type_val k)
358     {
359       key = k;
360       data.klass = NULL;
361       if (key == reference_type)
362         data.klass = &java::lang::Object::class$;
363       pc = UNINIT;
364     }
365 
366     // Make a new instance given a class.
367     type (jclass klass)
368     {
369       key = reference_type;
370       data.klass = klass;
371       pc = UNINIT;
372     }
373 
374     // Make a new instance given the name of a class.
375     type (_Jv_Utf8Const *n)
376     {
377       key = unresolved_reference_type;
378       data.name = n;
379       pc = UNINIT;
380     }
381 
382     // Copy constructor.
383     type (const type &t)
384     {
385       key = t.key;
386       data = t.data;
387       pc = t.pc;
388     }
389 
390     // These operators are required because libgcj can't link in
391     // -lstdc++.
392     void *operator new[] (size_t bytes)
393     {
394       return _Jv_Malloc (bytes);
395     }
396 
397     void operator delete[] (void *mem)
398     {
399       _Jv_Free (mem);
400     }
401 
402     type& operator= (type_val k)
403     {
404       key = k;
405       data.klass = NULL;
406       pc = UNINIT;
407       return *this;
408     }
409 
410     type& operator= (const type& t)
411     {
412       key = t.key;
413       data = t.data;
414       pc = t.pc;
415       return *this;
416     }
417 
418     // Promote a numeric type.
419     type &promote ()
420     {
421       if (key == boolean_type || key == char_type
422           || key == byte_type || key == short_type)
423         key = int_type;
424       return *this;
425     }
426 
427     // If *THIS is an unresolved reference type, resolve it.
428     void resolve (_Jv_BytecodeVerifier *verifier)
429     {
430       if (key != unresolved_reference_type
431           && key != uninitialized_unresolved_reference_type)
432         return;
433 
434       using namespace java::lang;
435       java::lang::ClassLoader *loader
436         = verifier->current_class->getClassLoaderInternal();
437       // We might see either kind of name.  Sigh.
438       if (data.name->data[0] == 'L'
439           && data.name->data[data.name->length - 1] == ';')
440         data.klass = _Jv_FindClassFromSignature (data.name->data, loader);
441       else
442         data.klass = Class::forName (_Jv_NewStringUtf8Const (data.name),
443                                      false, loader);
444       key = (key == unresolved_reference_type
445              ? reference_type
446              : uninitialized_reference_type);
447     }
448 
449     // Mark this type as the uninitialized result of `new'.
450     void set_uninitialized (int npc, _Jv_BytecodeVerifier *verifier)
451     {
452       if (key == reference_type)
453         key = uninitialized_reference_type;
454       else if (key == unresolved_reference_type)
455         key = uninitialized_unresolved_reference_type;
456       else
457         verifier->verify_fail ("internal error in type::uninitialized");
458       pc = npc;
459     }
460 
461     // Mark this type as now initialized.
462     void set_initialized (int npc)
463     {
464       if (npc != UNINIT && pc == npc
465           && (key == uninitialized_reference_type
466               || key == uninitialized_unresolved_reference_type))
467         {
468           key = (key == uninitialized_reference_type
469                  ? reference_type
470                  : unresolved_reference_type);
471           pc = UNINIT;
472         }
473     }
474 
475 
476     // Return true if an object of type K can be assigned to a variable
477     // of type *THIS.  Handle various special cases too.  Might modify
478     // *THIS or K.  Note however that this does not perform numeric
479     // promotion.
480     bool compatible (type &k, _Jv_BytecodeVerifier *verifier)
481     {
482       // Any type is compatible with the unsuitable type.
483       if (key == unsuitable_type)
484         return true;
485 
486       if (key < reference_type || k.key < reference_type)
487         return key == k.key;
488 
489       // The `null' type is convertible to any initialized reference
490       // type.
491       if (key == null_type || k.key == null_type)
492         return true;
493 
494       // Any reference type is convertible to Object.  This is a special
495       // case so we don't need to unnecessarily resolve a class.
496       if (key == reference_type
497           && data.klass == &java::lang::Object::class$)
498         return true;
499 
500       // An initialized type and an uninitialized type are not
501       // compatible.
502       if (isinitialized () != k.isinitialized ())
503         return false;
504 
505       // Two uninitialized objects are compatible if either:
506       // * The PCs are identical, or
507       // * One PC is UNINIT.
508       if (! isinitialized ())
509         {
510           if (pc != k.pc && pc != UNINIT && k.pc != UNINIT)
511             return false;
512         }
513 
514       // Two unresolved types are equal if their names are the same.
515       if (! isresolved ()
516           && ! k.isresolved ()
517           && _Jv_equalUtf8Consts (data.name, k.data.name))
518         return true;
519 
520       // We must resolve both types and check assignability.
521       resolve (verifier);
522       k.resolve (verifier);
523       return is_assignable_from_slow (data.klass, k.data.klass);
524     }
525 
526     bool isvoid () const
527     {
528       return key == void_type;
529     }
530 
531     bool iswide () const
532     {
533       return key == long_type || key == double_type;
534     }
535 
536     // Return number of stack or local variable slots taken by this
537     // type.
538     int depth () const
539     {
540       return iswide () ? 2 : 1;
541     }
542 
543     bool isarray () const
544     {
545       // We treat null_type as not an array.  This is ok based on the
546       // current uses of this method.
547       if (key == reference_type)
548         return data.klass->isArray ();
549       else if (key == unresolved_reference_type)
550         return data.name->data[0] == '[';
551       return false;
552     }
553 
554     bool isnull () const
555     {
556       return key == null_type;
557     }
558 
559     bool isinterface (_Jv_BytecodeVerifier *verifier)
560     {
561       resolve (verifier);
562       if (key != reference_type)
563         return false;
564       return data.klass->isInterface ();
565     }
566 
567     bool isabstract (_Jv_BytecodeVerifier *verifier)
568     {
569       resolve (verifier);
570       if (key != reference_type)
571         return false;
572       using namespace java::lang::reflect;
573       return Modifier::isAbstract (data.klass->getModifiers ());
574     }
575 
576     // Return the element type of an array.
577     type element_type (_Jv_BytecodeVerifier *verifier)
578     {
579       // FIXME: maybe should do string manipulation here.
580       resolve (verifier);
581       if (key != reference_type)
582         verifier->verify_fail ("programmer error in type::element_type()", -1);
583 
584       jclass k = data.klass->getComponentType ();
585       if (k->isPrimitive ())
586         return type (verifier->get_type_val_for_signature (k));
587       return type (k);
588     }
589 
590     // Return the array type corresponding to an initialized
591     // reference.  We could expand this to work for other kinds of
592     // types, but currently we don't need to.
593     type to_array (_Jv_BytecodeVerifier *verifier)
594     {
595       // Resolving isn't ideal, because it might force us to load
596       // another class, but it's easy.  FIXME?
597       if (key == unresolved_reference_type)
598         resolve (verifier);
599 
600       if (key == reference_type)
601         return type (_Jv_GetArrayClass (data.klass,
602                                         data.klass->getClassLoaderInternal()));
603       else
604         verifier->verify_fail ("internal error in type::to_array()");
605     }
606 
607     bool isreference () const
608     {
609       return key >= reference_type;
610     }
611 
612     int get_pc () const
613     {
614       return pc;
615     }
616 
617     bool isinitialized () const
618     {
619       return (key == reference_type
620               || key == null_type
621               || key == unresolved_reference_type);
622     }
623 
624     bool isresolved () const
625     {
626       return (key == reference_type
627               || key == null_type
628               || key == uninitialized_reference_type);
629     }
630 
631     void verify_dimensions (int ndims, _Jv_BytecodeVerifier *verifier)
632     {
633       // The way this is written, we don't need to check isarray().
634       if (key == reference_type)
635         {
636           jclass k = data.klass;
637           while (k->isArray () && ndims > 0)
638             {
639               k = k->getComponentType ();
640               --ndims;
641             }
642         }
643       else
644         {
645           // We know KEY == unresolved_reference_type.
646           char *p = data.name->data;
647           while (*p++ == '[' && ndims-- > 0)
648             ;
649         }
650 
651       if (ndims > 0)
652         verifier->verify_fail ("array type has fewer dimensions than required");
653     }
654 
655     // Merge OLD_TYPE into this.  On error throw exception.
656     bool merge (type& old_type, bool local_semantics,
657                 _Jv_BytecodeVerifier *verifier)
658     {
659       bool changed = false;
660       bool refo = old_type.isreference ();
661       bool refn = isreference ();
662       if (refo && refn)
663         {
664           if (old_type.key == null_type)
665             ;
666           else if (key == null_type)
667             {
668               *this = old_type;
669               changed = true;
670             }
671           else if (isinitialized () != old_type.isinitialized ())
672             verifier->verify_fail ("merging initialized and uninitialized types");
673           else
674             {
675               if (! isinitialized ())
676                 {
677                   if (pc == UNINIT)
678                     pc = old_type.pc;
679                   else if (old_type.pc == UNINIT)
680                     ;
681                   else if (pc != old_type.pc)
682                     verifier->verify_fail ("merging different uninitialized types");
683                 }
684 
685               if (! isresolved ()
686                   && ! old_type.isresolved ()
687                   && _Jv_equalUtf8Consts (data.name, old_type.data.name))
688                 {
689                   // Types are identical.
690                 }
691               else
692                 {
693                   resolve (verifier);
694                   old_type.resolve (verifier);
695 
696                   jclass k = data.klass;
697                   jclass oldk = old_type.data.klass;
698 
699                   int arraycount = 0;
700                   while (k->isArray () && oldk->isArray ())
701                     {
702                       ++arraycount;
703                       k = k->getComponentType ();
704                       oldk = oldk->getComponentType ();
705                     }
706 
707                   // Ordinarily this terminates when we hit Object...
708                   while (k != NULL)
709                     {
710                       if (is_assignable_from_slow (k, oldk))
711                         break;
712                       k = k->getSuperclass ();
713                       changed = true;
714                     }
715                   // ... but K could have been an interface, in which
716                   // case we'll end up here.  We just convert this
717                   // into Object.
718                   if (k == NULL)
719                     k = &java::lang::Object::class$;
720 
721                   if (changed)
722                     {
723                       while (arraycount > 0)
724                         {
725                           java::lang::ClassLoader *loader
726                             = verifier->current_class->getClassLoaderInternal();
727                           k = _Jv_GetArrayClass (k, loader);
728                           --arraycount;
729                         }
730                       data.klass = k;
731                     }
732                 }
733             }
734         }
735       else if (refo || refn || key != old_type.key)
736         {
737           if (local_semantics)
738             {
739               // If we're merging into an "unused" slot, then we
740               // simply accept whatever we're merging from.
741               if (key == unused_by_subroutine_type)
742                 {
743                   *this = old_type;
744                   changed = true;
745                 }
746               else if (old_type.key == unused_by_subroutine_type)
747                 {
748                   // Do nothing.
749                 }
750               // If we already have an `unsuitable' type, then we
751               // don't need to change again.
752               else if (key != unsuitable_type)
753                 {
754                   key = unsuitable_type;
755                   changed = true;
756                 }
757             }
758           else
759             verifier->verify_fail ("unmergeable type");
760         }
761       return changed;
762     }
763 
764 #ifdef VERIFY_DEBUG
765     void print (void) const
766     {
767       char c = '?';
768       switch (key)
769         {
770         case boolean_type: c = 'Z'; break;
771         case byte_type: c = 'B'; break;
772         case char_type: c = 'C'; break;
773         case short_type: c = 'S'; break;
774         case int_type: c = 'I'; break;
775         case long_type: c = 'J'; break;
776         case float_type: c = 'F'; break;
777         case double_type: c = 'D'; break;
778         case void_type: c = 'V'; break;
779         case unsuitable_type: c = '-'; break;
780         case return_address_type: c = 'r'; break;
781         case continuation_type: c = '+'; break;
782         case unused_by_subroutine_type: c = '_'; break;
783         case reference_type: c = 'L'; break;
784         case null_type: c = '@'; break;
785         case unresolved_reference_type: c = 'l'; break;
786         case uninitialized_reference_type: c = 'U'; break;
787         case uninitialized_unresolved_reference_type: c = 'u'; break;
788         }
789       debug_print ("%c", c);
790     }
791 #endif /* VERIFY_DEBUG */
792   };
793 
794   // This class holds all the state information we need for a given
795   // location.
796   struct state
797   {
798     // The current top of the stack, in terms of slots.
799     int stacktop;
800     // The current depth of the stack.  This will be larger than
801     // STACKTOP when wide types are on the stack.
802     int stackdepth;
803     // The stack.
804     type *stack;
805     // The local variables.
806     type *locals;
807     // This is used in subroutines to keep track of which local
808     // variables have been accessed.
809     bool *local_changed;
810     // If not 0, then we are in a subroutine.  The value is the PC of
811     // the subroutine's entry point.  We can use 0 as an exceptional
812     // value because PC=0 can never be a subroutine.
813     int subroutine;
814     // This is used to keep a linked list of all the states which
815     // require re-verification.  We use the PC to keep track.
816     int next;
817     // We keep track of the type of `this' specially.  This is used to
818     // ensure that an instance initializer invokes another initializer
819     // on `this' before returning.  We must keep track of this
820     // specially because otherwise we might be confused by code which
821     // assigns to locals[0] (overwriting `this') and then returns
822     // without really initializing.
823     type this_type;
824     // This is a list of all subroutines that have been seen at this
825     // point.  Ordinarily this is NULL; it is only allocated and used
826     // in relatively weird situations involving non-ret exit from a
827     // subroutine.  We have to keep track of this in this way to avoid
828     // endless recursion in these cases.
829     subr_info *seen_subrs;
830 
831     // INVALID marks a state which is not on the linked list of states
832     // requiring reverification.
833     static const int INVALID = -1;
834     // NO_NEXT marks the state at the end of the reverification list.
835     static const int NO_NEXT = -2;
836 
837     // This is used to mark the stack depth at the instruction just
838     // after a `jsr' when we haven't yet processed the corresponding
839     // `ret'.  See handle_jsr_insn for more information.
840     static const int NO_STACK = -1;
841 
842     state ()
843       : this_type ()
844     {
845       stack = NULL;
846       locals = NULL;
847       local_changed = NULL;
848       seen_subrs = NULL;
849     }
850 
851     state (int max_stack, int max_locals)
852       : this_type ()
853     {
854       stacktop = 0;
855       stackdepth = 0;
856       stack = new type[max_stack];
857       for (int i = 0; i < max_stack; ++i)
858         stack[i] = unsuitable_type;
859       locals = new type[max_locals];
860       local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals);
861       seen_subrs = NULL;
862       for (int i = 0; i < max_locals; ++i)
863         {
864           locals[i] = unsuitable_type;
865           local_changed[i] = false;
866         }
867       next = INVALID;
868       subroutine = 0;
869     }
870 
871     state (const state *orig, int max_stack, int max_locals,
872            bool ret_semantics = false)
873     {
874       stack = new type[max_stack];
875       locals = new type[max_locals];
876       local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals);
877       seen_subrs = NULL;
878       copy (orig, max_stack, max_locals, ret_semantics);
879       next = INVALID;
880     }
881 
882     ~state ()
883     {
884       if (stack)
885         delete[] stack;
886       if (locals)
887         delete[] locals;
888       if (local_changed)
889         _Jv_Free (local_changed);
890       clean_subrs ();
891     }
892 
893     void *operator new[] (size_t bytes)
894     {
895       return _Jv_Malloc (bytes);
896     }
897 
898     void operator delete[] (void *mem)
899     {
900       _Jv_Free (mem);
901     }
902 
903     void *operator new (size_t bytes)
904     {
905       return _Jv_Malloc (bytes);
906     }
907 
908     void operator delete (void *mem)
909     {
910       _Jv_Free (mem);
911     }
912 
913     void clean_subrs ()
914     {
915       subr_info *info = seen_subrs;
916       while (info != NULL)
917         {
918           subr_info *next = info->next;
919           _Jv_Free (info);
920           info = next;
921         }
922     }
923 
924     void copy (const state *copy, int max_stack, int max_locals,
925                bool ret_semantics = false)
926     {
927       stacktop = copy->stacktop;
928       stackdepth = copy->stackdepth;
929       subroutine = copy->subroutine;
930       for (int i = 0; i < max_stack; ++i)
931         stack[i] = copy->stack[i];
932       for (int i = 0; i < max_locals; ++i)
933         {
934           // See push_jump_merge to understand this case.
935           if (ret_semantics)
936             locals[i] = type (copy->local_changed[i]
937                               ? unsuitable_type
938                               : unused_by_subroutine_type);
939           else
940             locals[i] = copy->locals[i];
941           local_changed[i] = copy->local_changed[i];
942         }
943 
944       clean_subrs ();
945       if (copy->seen_subrs)
946         {
947           for (subr_info *info = seen_subrs; info != NULL; info = info->next)
948             add_subr (info->pc);
949         }
950       else
951         seen_subrs = NULL;
952 
953       this_type = copy->this_type;
954       // Don't modify `next'.
955     }
956 
957     // Modify this state to reflect entry to an exception handler.
958     void set_exception (type t, int max_stack)
959     {
960       stackdepth = 1;
961       stacktop = 1;
962       stack[0] = t;
963       for (int i = stacktop; i < max_stack; ++i)
964         stack[i] = unsuitable_type;
965     }
966 
967     // Modify this state to reflect entry into a subroutine.
968     void enter_subroutine (int npc, int max_locals)
969     {
970       subroutine = npc;
971       // Mark all items as unchanged.  Each subroutine needs to keep
972       // track of its `changed' state independently.  In the case of
973       // nested subroutines, this information will be merged back into
974       // parent by the `ret'.
975       for (int i = 0; i < max_locals; ++i)
976         local_changed[i] = false;
977     }
978 
979     // Indicate that we've been in this this subroutine.
980     void add_subr (int pc)
981     {
982       subr_info *n = (subr_info *) _Jv_Malloc (sizeof (subr_info));
983       n->pc = pc;
984       n->next = seen_subrs;
985       seen_subrs = n;
986     }
987 
988     // Merge STATE_OLD into this state.  Destructively modifies this
989     // state.  Returns true if the new state was in fact changed.
990     // Will throw an exception if the states are not mergeable.
991     bool merge (state *state_old, bool ret_semantics,
992                 int max_locals, _Jv_BytecodeVerifier *verifier)
993     {
994       bool changed = false;
995 
996       // Special handling for `this'.  If one or the other is
997       // uninitialized, then the merge is uninitialized.
998       if (this_type.isinitialized ())
999         this_type = state_old->this_type;
1000 
1001       // Merge subroutine states.  Here we just keep track of what
1002       // subroutine we think we're in.  We only check for a merge
1003       // (which is invalid) when we see a `ret'.
1004       if (subroutine == state_old->subroutine)
1005         {
1006           // Nothing.
1007         }
1008       else if (subroutine == 0)
1009         {
1010           subroutine = state_old->subroutine;
1011           changed = true;
1012         }
1013       else
1014         {
1015           // If the subroutines differ, and we haven't seen this
1016           // subroutine before, indicate that the state changed.  This
1017           // is needed to detect when subroutines have merged.
1018           bool found = false;
1019           for (subr_info *info = seen_subrs; info != NULL; info = info->next)
1020             {
1021               if (info->pc == state_old->subroutine)
1022                 {
1023                   found = true;
1024                   break;
1025                 }
1026             }
1027           if (! found)
1028             {
1029               add_subr (state_old->subroutine);
1030               changed = true;
1031             }
1032         }
1033 
1034       // Merge stacks.  Special handling for NO_STACK case.
1035       if (state_old->stacktop == NO_STACK)
1036         {
1037           // Nothing to do in this case; we don't care about modifying
1038           // the old state.
1039         }
1040       else if (stacktop == NO_STACK)
1041         {
1042           stacktop = state_old->stacktop;
1043           stackdepth = state_old->stackdepth;
1044           for (int i = 0; i < stacktop; ++i)
1045             stack[i] = state_old->stack[i];
1046           changed = true;
1047         }
1048       else if (state_old->stacktop != stacktop)
1049         verifier->verify_fail ("stack sizes differ");
1050       else
1051         {
1052           for (int i = 0; i < state_old->stacktop; ++i)
1053             {
1054               if (stack[i].merge (state_old->stack[i], false, verifier))
1055                 changed = true;
1056             }
1057         }
1058 
1059       // Merge local variables.
1060       for (int i = 0; i < max_locals; ++i)
1061         {
1062           // If we're not processing a `ret', then we merge every
1063           // local variable.  If we are processing a `ret', then we
1064           // only merge locals which changed in the subroutine.  When
1065           // processing a `ret', STATE_OLD is the state at the point
1066           // of the `ret', and THIS is the state just after the `jsr'.
1067           if (! ret_semantics || state_old->local_changed[i])
1068             {
1069               if (locals[i].merge (state_old->locals[i], true, verifier))
1070                 {
1071                   // Note that we don't call `note_variable' here.
1072                   // This change doesn't represent a real change to a
1073                   // local, but rather a merge artifact.  If we're in
1074                   // a subroutine which is called with two
1075                   // incompatible types in a slot that is unused by
1076                   // the subroutine, then we don't want to mark that
1077                   // variable as having been modified.
1078                   changed = true;
1079                 }
1080             }
1081 
1082           // If we're in a subroutine, we must compute the union of
1083           // all the changed local variables.
1084           if (state_old->local_changed[i])
1085             note_variable (i);
1086         }
1087 
1088       return changed;
1089     }
1090 
1091     // Throw an exception if there is an uninitialized object on the
1092     // stack or in a local variable.  EXCEPTION_SEMANTICS controls
1093     // whether we're using backwards-branch or exception-handing
1094     // semantics.
1095     void check_no_uninitialized_objects (int max_locals,
1096                                          _Jv_BytecodeVerifier *verifier,
1097                                          bool exception_semantics = false)
1098     {
1099       if (! exception_semantics)
1100         {
1101           for (int i = 0; i < stacktop; ++i)
1102             if (stack[i].isreference () && ! stack[i].isinitialized ())
1103               verifier->verify_fail ("uninitialized object on stack");
1104         }
1105 
1106       for (int i = 0; i < max_locals; ++i)
1107         if (locals[i].isreference () && ! locals[i].isinitialized ())
1108           verifier->verify_fail ("uninitialized object in local variable");
1109 
1110       check_this_initialized (verifier);
1111     }
1112 
1113     // Ensure that `this' has been initialized.
1114     void check_this_initialized (_Jv_BytecodeVerifier *verifier)
1115     {
1116       if (this_type.isreference () && ! this_type.isinitialized ())
1117         verifier->verify_fail ("`this' is uninitialized");
1118     }
1119 
1120     // Set type of `this'.
1121     void set_this_type (const type &k)
1122     {
1123       this_type = k;
1124     }
1125 
1126     // Note that a local variable was modified.
1127     void note_variable (int index)
1128     {
1129       if (subroutine > 0)
1130         local_changed[index] = true;
1131     }
1132 
1133     // Mark each `new'd object we know of that was allocated at PC as
1134     // initialized.
1135     void set_initialized (int pc, int max_locals)
1136     {
1137       for (int i = 0; i < stacktop; ++i)
1138         stack[i].set_initialized (pc);
1139       for (int i = 0; i < max_locals; ++i)
1140         locals[i].set_initialized (pc);
1141       this_type.set_initialized (pc);
1142     }
1143 
1144     // Return true if this state is the unmerged result of a `ret'.
1145     bool is_unmerged_ret_state (int max_locals) const
1146     {
1147       if (stacktop == NO_STACK)
1148         return true;
1149       for (int i = 0; i < max_locals; ++i)
1150         {
1151           if (locals[i].key == unused_by_subroutine_type)
1152             return true;
1153         }
1154       return false;
1155     }
1156 
1157 #ifdef VERIFY_DEBUG
1158     void print (const char *leader, int pc,
1159                 int max_stack, int max_locals) const
1160     {
1161       debug_print ("%s [%4d]:   [stack] ", leader, pc);
1162       int i;
1163       for (i = 0; i < stacktop; ++i)
1164         stack[i].print ();
1165       for (; i < max_stack; ++i)
1166         debug_print (".");
1167       debug_print ("    [local] ");
1168       for (i = 0; i < max_locals; ++i)
1169         {
1170           locals[i].print ();
1171           debug_print (local_changed[i] ? "+" : " ");
1172         }
1173       if (subroutine == 0)
1174         debug_print ("   | None");
1175       else
1176         debug_print ("   | %4d", subroutine);
1177       debug_print (" | %p\n", this);
1178     }
1179 #else
1180     inline void print (const char *, int, int, int) const
1181     {
1182     }
1183 #endif /* VERIFY_DEBUG */
1184   };
1185 
1186   type pop_raw ()
1187   {
1188     if (current_state->stacktop <= 0)
1189       verify_fail ("stack empty");
1190     type r = current_state->stack[--current_state->stacktop];
1191     current_state->stackdepth -= r.depth ();
1192     if (current_state->stackdepth < 0)
1193       verify_fail ("stack empty", start_PC);
1194     return r;
1195   }
1196 
1197   type pop32 ()
1198   {
1199     type r = pop_raw ();
1200     if (r.iswide ())
1201       verify_fail ("narrow pop of wide type");
1202     return r;
1203   }
1204 
1205   type pop_type (type match)
1206   {
1207     match.promote ();
1208     type t = pop_raw ();
1209     if (! match.compatible (t, this))
1210       verify_fail ("incompatible type on stack");
1211     return t;
1212   }
1213 
1214   // Pop a reference which is guaranteed to be initialized.  MATCH
1215   // doesn't have to be a reference type; in this case this acts like
1216   // pop_type.
1217   type pop_init_ref (type match)
1218   {
1219     type t = pop_raw ();
1220     if (t.isreference () && ! t.isinitialized ())
1221       verify_fail ("initialized reference required");
1222     else if (! match.compatible (t, this))
1223       verify_fail ("incompatible type on stack");
1224     return t;
1225   }
1226 
1227   // Pop a reference type or a return address.
1228   type pop_ref_or_return ()
1229   {
1230     type t = pop_raw ();
1231     if (! t.isreference () && t.key != return_address_type)
1232       verify_fail ("expected reference or return address on stack");
1233     return t;
1234   }
1235 
1236   void push_type (type t)
1237   {
1238     // If T is a numeric type like short, promote it to int.
1239     t.promote ();
1240 
1241     int depth = t.depth ();
1242     if (current_state->stackdepth + depth > current_method->max_stack)
1243       verify_fail ("stack overflow");
1244     current_state->stack[current_state->stacktop++] = t;
1245     current_state->stackdepth += depth;
1246   }
1247 
1248   void set_variable (int index, type t)
1249   {
1250     // If T is a numeric type like short, promote it to int.
1251     t.promote ();
1252 
1253     int depth = t.depth ();
1254     if (index > current_method->max_locals - depth)
1255       verify_fail ("invalid local variable");
1256     current_state->locals[index] = t;
1257     current_state->note_variable (index);
1258 
1259     if (depth == 2)
1260       {
1261         current_state->locals[index + 1] = continuation_type;
1262         current_state->note_variable (index + 1);
1263       }
1264     if (index > 0 && current_state->locals[index - 1].iswide ())
1265       {
1266         current_state->locals[index - 1] = unsuitable_type;
1267         // There's no need to call note_variable here.
1268       }
1269   }
1270 
1271   type get_variable (int index, type t)
1272   {
1273     int depth = t.depth ();
1274     if (index > current_method->max_locals - depth)
1275       verify_fail ("invalid local variable");
1276     if (! t.compatible (current_state->locals[index], this))
1277       verify_fail ("incompatible type in local variable");
1278     if (depth == 2)
1279       {
1280         type t (continuation_type);
1281         if (! current_state->locals[index + 1].compatible (t, this))
1282           verify_fail ("invalid local variable");
1283       }
1284     return current_state->locals[index];
1285   }
1286 
1287   // Make sure ARRAY is an array type and that its elements are
1288   // compatible with type ELEMENT.  Returns the actual element type.
1289   type require_array_type (type array, type element)
1290   {
1291     // An odd case.  Here we just pretend that everything went ok.  If
1292     // the requested element type is some kind of reference, return
1293     // the null type instead.
1294     if (array.isnull ())
1295       return element.isreference () ? type (null_type) : element;
1296 
1297     if (! array.isarray ())
1298       verify_fail ("array required");
1299 
1300     type t = array.element_type (this);
1301     if (! element.compatible (t, this))
1302       {
1303         // Special case for byte arrays, which must also be boolean
1304         // arrays.
1305         bool ok = true;
1306         if (element.key == byte_type)
1307           {
1308             type e2 (boolean_type);
1309             ok = e2.compatible (t, this);
1310           }
1311         if (! ok)
1312           verify_fail ("incompatible array element type");
1313       }
1314 
1315     // Return T and not ELEMENT, because T might be specialized.
1316     return t;
1317   }
1318 
1319   jint get_byte ()
1320   {
1321     if (PC >= current_method->code_length)
1322       verify_fail ("premature end of bytecode");
1323     return (jint) bytecode[PC++] & 0xff;
1324   }
1325 
1326   jint get_ushort ()
1327   {
1328     jint b1 = get_byte ();
1329     jint b2 = get_byte ();
1330     return (jint) ((b1 << 8) | b2) & 0xffff;
1331   }
1332 
1333   jint get_short ()
1334   {
1335     jint b1 = get_byte ();
1336     jint b2 = get_byte ();
1337     jshort s = (b1 << 8) | b2;
1338     return (jint) s;
1339   }
1340 
1341   jint get_int ()
1342   {
1343     jint b1 = get_byte ();
1344     jint b2 = get_byte ();
1345     jint b3 = get_byte ();
1346     jint b4 = get_byte ();
1347     return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
1348   }
1349 
1350   int compute_jump (int offset)
1351   {
1352     int npc = start_PC + offset;
1353     if (npc < 0 || npc >= current_method->code_length)
1354       verify_fail ("branch out of range", start_PC);
1355     return npc;
1356   }
1357 
1358   // Merge the indicated state into the state at the branch target and
1359   // schedule a new PC if there is a change.  If RET_SEMANTICS is
1360   // true, then we are merging from a `ret' instruction into the
1361   // instruction after a `jsr'.  This is a special case with its own
1362   // modified semantics.
1363   void push_jump_merge (int npc, state *nstate, bool ret_semantics = false)
1364   {
1365     bool changed = true;
1366     if (states[npc] == NULL)
1367       {
1368         // There's a weird situation here.  If are examining the
1369         // branch that results from a `ret', and there is not yet a
1370         // state available at the branch target (the instruction just
1371         // after the `jsr'), then we have to construct a special kind
1372         // of state at that point for future merging.  This special
1373         // state has the type `unused_by_subroutine_type' in each slot
1374         // which was not modified by the subroutine.
1375         states[npc] = new state (nstate, current_method->max_stack,
1376                                  current_method->max_locals, ret_semantics);
1377         debug_print ("== New state in push_jump_merge\n");
1378         states[npc]->print ("New", npc, current_method->max_stack,
1379                             current_method->max_locals);
1380       }
1381     else
1382       {
1383         debug_print ("== Merge states in push_jump_merge\n");
1384         nstate->print ("Frm", start_PC, current_method->max_stack,
1385                        current_method->max_locals);
1386         states[npc]->print (" To", npc, current_method->max_stack,
1387                             current_method->max_locals);
1388         changed = states[npc]->merge (nstate, ret_semantics,
1389                                       current_method->max_locals, this);
1390         states[npc]->print ("New", npc, current_method->max_stack,
1391                             current_method->max_locals);
1392       }
1393 
1394     if (changed && states[npc]->next == state::INVALID)
1395       {
1396         // The merge changed the state, and the new PC isn't yet on our
1397         // list of PCs to re-verify.
1398         states[npc]->next = next_verify_pc;
1399         next_verify_pc = npc;
1400       }
1401   }
1402 
1403   void push_jump (int offset)
1404   {
1405     int npc = compute_jump (offset);
1406     if (npc < PC)
1407       current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1408     push_jump_merge (npc, current_state);
1409   }
1410 
1411   void push_exception_jump (type t, int pc)
1412   {
1413     current_state->check_no_uninitialized_objects (current_method->max_locals,
1414                                                    this, true);
1415     state s (current_state, current_method->max_stack,
1416              current_method->max_locals);
1417     if (current_method->max_stack < 1)
1418       verify_fail ("stack overflow at exception handler");
1419     s.set_exception (t, current_method->max_stack);
1420     push_jump_merge (pc, &s);
1421   }
1422 
1423   int pop_jump ()
1424   {
1425     int *prev_loc = &next_verify_pc;
1426     int npc = next_verify_pc;
1427 
1428     while (npc != state::NO_NEXT)
1429       {
1430         // If the next available PC is an unmerged `ret' state, then
1431         // we aren't yet ready to handle it.  That's because we would
1432         // need all kind of special cases to do so.  So instead we
1433         // defer this jump until after we've processed it via a
1434         // fall-through.  This has to happen because the instruction
1435         // before this one must be a `jsr'.
1436         if (! states[npc]->is_unmerged_ret_state (current_method->max_locals))
1437           {
1438             *prev_loc = states[npc]->next;
1439             states[npc]->next = state::INVALID;
1440             return npc;
1441           }
1442 
1443         prev_loc = &states[npc]->next;
1444         npc = states[npc]->next;
1445       }
1446 
1447     // Note that we might have gotten here even when there are
1448     // remaining states to process.  That can happen if we find a
1449     // `jsr' without a `ret'.
1450     return state::NO_NEXT;
1451   }
1452 
1453   void invalidate_pc ()
1454   {
1455     PC = state::NO_NEXT;
1456   }
1457 
1458   void note_branch_target (int pc, bool is_jsr_target = false)
1459   {
1460     // Don't check `pc <= PC', because we've advanced PC after
1461     // fetching the target and we haven't yet checked the next
1462     // instruction.
1463     if (pc < PC && ! (flags[pc] & FLAG_INSN_START))
1464       verify_fail ("branch not to instruction start", start_PC);
1465     flags[pc] |= FLAG_BRANCH_TARGET;
1466     if (is_jsr_target)
1467       {
1468         // Record the jsr which called this instruction.
1469         subr_info *info = (subr_info *) _Jv_Malloc (sizeof (subr_info));
1470         info->pc = PC;
1471         info->next = jsr_ptrs[pc];
1472         jsr_ptrs[pc] = info;
1473       }
1474   }
1475 
1476   void skip_padding ()
1477   {
1478     while ((PC % 4) > 0)
1479       if (get_byte () != 0)
1480         verify_fail ("found nonzero padding byte");
1481   }
1482 
1483   // Return the subroutine to which the instruction at PC belongs.
1484   int get_subroutine (int pc)
1485   {
1486     if (states[pc] == NULL)
1487       return 0;
1488     return states[pc]->subroutine;
1489   }
1490 
1491   // Do the work for a `ret' instruction.  INDEX is the index into the
1492   // local variables.
1493   void handle_ret_insn (int index)
1494   {
1495     get_variable (index, return_address_type);
1496 
1497     int csub = current_state->subroutine;
1498     if (csub == 0)
1499       verify_fail ("no subroutine");
1500 
1501     // Check to see if we've merged subroutines.
1502     subr_entry_info *entry;
1503     for (entry = entry_points; entry != NULL; entry = entry->next)
1504       {
1505         if (entry->ret_pc == start_PC)
1506           break;
1507       }
1508     if (entry == NULL)
1509       {
1510         entry = (subr_entry_info *) _Jv_Malloc (sizeof (subr_entry_info));
1511         entry->pc = csub;
1512         entry->ret_pc = start_PC;
1513         entry->next = entry_points;
1514         entry_points = entry;
1515       }
1516     else if (entry->pc != csub)
1517       verify_fail ("subroutines merged");
1518 
1519     for (subr_info *subr = jsr_ptrs[csub]; subr != NULL; subr = subr->next)
1520       {
1521         // We might be returning to a `jsr' that is at the end of the
1522         // bytecode.  This is ok if we never return from the called
1523         // subroutine, but if we see this here it is an error.
1524         if (subr->pc >= current_method->code_length)
1525           verify_fail ("fell off end");
1526 
1527         // Temporarily modify the current state so it looks like we're
1528         // in the enclosing context.
1529         current_state->subroutine = get_subroutine (subr->pc);
1530         if (subr->pc < PC)
1531           current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1532         push_jump_merge (subr->pc, current_state, true);
1533       }
1534 
1535     current_state->subroutine = csub;
1536     invalidate_pc ();
1537   }
1538 
1539   // We're in the subroutine SUB, calling a subroutine at DEST.  Make
1540   // sure this subroutine isn't already on the stack.
1541   void check_nonrecursive_call (int sub, int dest)
1542   {
1543     if (sub == 0)
1544       return;
1545     if (sub == dest)
1546       verify_fail ("recursive subroutine call");
1547     for (subr_info *info = jsr_ptrs[sub]; info != NULL; info = info->next)
1548       check_nonrecursive_call (get_subroutine (info->pc), dest);
1549   }
1550 
1551   void handle_jsr_insn (int offset)
1552   {
1553     int npc = compute_jump (offset);
1554 
1555     if (npc < PC)
1556       current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1557     check_nonrecursive_call (current_state->subroutine, npc);
1558 
1559     // Modify our state as appropriate for entry into a subroutine.
1560     push_type (return_address_type);
1561     push_jump_merge (npc, current_state);
1562     // Clean up.
1563     pop_type (return_address_type);
1564 
1565     // On entry to the subroutine, the subroutine number must be set
1566     // and the locals must be marked as cleared.  We do this after
1567     // merging state so that we don't erroneously "notice" a variable
1568     // change merely on entry.
1569     states[npc]->enter_subroutine (npc, current_method->max_locals);
1570 
1571     // Indicate that we don't know the stack depth of the instruction
1572     // following the `jsr'.  The idea here is that we need to merge
1573     // the local variable state across the jsr, but the subroutine
1574     // might change the stack depth, so we can't make any assumptions
1575     // about it.  So we have yet another special case.  We know that
1576     // at this point PC points to the instruction after the jsr.  Note
1577     // that it is ok to have a `jsr' at the end of the bytecode,
1578     // provided that the called subroutine never returns.  So, we have
1579     // a special case here and another one when we handle the ret.
1580     if (PC < current_method->code_length)
1581       {
1582         current_state->stacktop = state::NO_STACK;
1583         push_jump_merge (PC, current_state);
1584       }
1585     invalidate_pc ();
1586   }
1587 
1588   jclass construct_primitive_array_type (type_val prim)
1589   {
1590     jclass k = NULL;
1591     switch (prim)
1592       {
1593       case boolean_type:
1594         k = JvPrimClass (boolean);
1595         break;
1596       case char_type:
1597         k = JvPrimClass (char);
1598         break;
1599       case float_type:
1600         k = JvPrimClass (float);
1601         break;
1602       case double_type:
1603         k = JvPrimClass (double);
1604         break;
1605       case byte_type:
1606         k = JvPrimClass (byte);
1607         break;
1608       case short_type:
1609         k = JvPrimClass (short);
1610         break;
1611       case int_type:
1612         k = JvPrimClass (int);
1613         break;
1614       case long_type:
1615         k = JvPrimClass (long);
1616         break;
1617 
1618       // These aren't used here but we call them out to avoid
1619       // warnings.
1620       case void_type:
1621       case unsuitable_type:
1622       case return_address_type:
1623       case continuation_type:
1624       case unused_by_subroutine_type:
1625       case reference_type:
1626       case null_type:
1627       case unresolved_reference_type:
1628       case uninitialized_reference_type:
1629       case uninitialized_unresolved_reference_type:
1630       default:
1631         verify_fail ("unknown type in construct_primitive_array_type");
1632       }
1633     k = _Jv_GetArrayClass (k, NULL);
1634     return k;
1635   }
1636 
1637   // This pass computes the location of branch targets and also
1638   // instruction starts.
1639   void branch_prepass ()
1640   {
1641     flags = (char *) _Jv_Malloc (current_method->code_length);
1642     jsr_ptrs = (subr_info **) _Jv_Malloc (sizeof (subr_info *)
1643                                           * current_method->code_length);
1644 
1645     for (int i = 0; i < current_method->code_length; ++i)
1646       {
1647         flags[i] = 0;
1648         jsr_ptrs[i] = NULL;
1649       }
1650 
1651     bool last_was_jsr = false;
1652 
1653     PC = 0;
1654     while (PC < current_method->code_length)
1655       {
1656         // Set `start_PC' early so that error checking can have the
1657         // correct value.
1658         start_PC = PC;
1659         flags[PC] |= FLAG_INSN_START;
1660 
1661         // If the previous instruction was a jsr, then the next
1662         // instruction is a branch target -- the branch being the
1663         // corresponding `ret'.
1664         if (last_was_jsr)
1665           note_branch_target (PC);
1666         last_was_jsr = false;
1667 
1668         java_opcode opcode = (java_opcode) bytecode[PC++];
1669         switch (opcode)
1670           {
1671           case op_nop:
1672           case op_aconst_null:
1673           case op_iconst_m1:
1674           case op_iconst_0:
1675           case op_iconst_1:
1676           case op_iconst_2:
1677           case op_iconst_3:
1678           case op_iconst_4:
1679           case op_iconst_5:
1680           case op_lconst_0:
1681           case op_lconst_1:
1682           case op_fconst_0:
1683           case op_fconst_1:
1684           case op_fconst_2:
1685           case op_dconst_0:
1686           case op_dconst_1:
1687           case op_iload_0:
1688           case op_iload_1:
1689           case op_iload_2:
1690           case op_iload_3:
1691           case op_lload_0:
1692           case op_lload_1:
1693           case op_lload_2:
1694           case op_lload_3:
1695           case op_fload_0:
1696           case op_fload_1:
1697           case op_fload_2:
1698           case op_fload_3:
1699           case op_dload_0:
1700           case op_dload_1:
1701           case op_dload_2:
1702           case op_dload_3:
1703           case op_aload_0:
1704           case op_aload_1:
1705           case op_aload_2:
1706           case op_aload_3:
1707           case op_iaload:
1708           case op_laload:
1709           case op_faload:
1710           case op_daload:
1711           case op_aaload:
1712           case op_baload:
1713           case op_caload:
1714           case op_saload:
1715           case op_istore_0:
1716           case op_istore_1:
1717           case op_istore_2:
1718           case op_istore_3:
1719           case op_lstore_0:
1720           case op_lstore_1:
1721           case op_lstore_2:
1722           case op_lstore_3:
1723           case op_fstore_0:
1724           case op_fstore_1:
1725           case op_fstore_2:
1726           case op_fstore_3:
1727           case op_dstore_0:
1728           case op_dstore_1:
1729           case op_dstore_2:
1730           case op_dstore_3:
1731           case op_astore_0:
1732           case op_astore_1:
1733           case op_astore_2:
1734           case op_astore_3:
1735           case op_iastore:
1736           case op_lastore:
1737           case op_fastore:
1738           case op_dastore:
1739           case op_aastore:
1740           case op_bastore:
1741           case op_castore:
1742           case op_sastore:
1743           case op_pop:
1744           case op_pop2:
1745           case op_dup:
1746           case op_dup_x1:
1747           case op_dup_x2:
1748           case op_dup2:
1749           case op_dup2_x1:
1750           case op_dup2_x2:
1751           case op_swap:
1752           case op_iadd:
1753           case op_isub:
1754           case op_imul:
1755           case op_idiv:
1756           case op_irem:
1757           case op_ishl:
1758           case op_ishr:
1759           case op_iushr:
1760           case op_iand:
1761           case op_ior:
1762           case op_ixor:
1763           case op_ladd:
1764           case op_lsub:
1765           case op_lmul:
1766           case op_ldiv:
1767           case op_lrem:
1768           case op_lshl:
1769           case op_lshr:
1770           case op_lushr:
1771           case op_land:
1772           case op_lor:
1773           case op_lxor:
1774           case op_fadd:
1775           case op_fsub:
1776           case op_fmul:
1777           case op_fdiv:
1778           case op_frem:
1779           case op_dadd:
1780           case op_dsub:
1781           case op_dmul:
1782           case op_ddiv:
1783           case op_drem:
1784           case op_ineg:
1785           case op_i2b:
1786           case op_i2c:
1787           case op_i2s:
1788           case op_lneg:
1789           case op_fneg:
1790           case op_dneg:
1791           case op_i2l:
1792           case op_i2f:
1793           case op_i2d:
1794           case op_l2i:
1795           case op_l2f:
1796           case op_l2d:
1797           case op_f2i:
1798           case op_f2l:
1799           case op_f2d:
1800           case op_d2i:
1801           case op_d2l:
1802           case op_d2f:
1803           case op_lcmp:
1804           case op_fcmpl:
1805           case op_fcmpg:
1806           case op_dcmpl:
1807           case op_dcmpg:
1808           case op_monitorenter:
1809           case op_monitorexit:
1810           case op_ireturn:
1811           case op_lreturn:
1812           case op_freturn:
1813           case op_dreturn:
1814           case op_areturn:
1815           case op_return:
1816           case op_athrow:
1817           case op_arraylength:
1818             break;
1819 
1820           case op_bipush:
1821           case op_ldc:
1822           case op_iload:
1823           case op_lload:
1824           case op_fload:
1825           case op_dload:
1826           case op_aload:
1827           case op_istore:
1828           case op_lstore:
1829           case op_fstore:
1830           case op_dstore:
1831           case op_astore:
1832           case op_ret:
1833           case op_newarray:
1834             get_byte ();
1835             break;
1836 
1837           case op_iinc:
1838           case op_sipush:
1839           case op_ldc_w:
1840           case op_ldc2_w:
1841           case op_getstatic:
1842           case op_getfield:
1843           case op_putfield:
1844           case op_putstatic:
1845           case op_new:
1846           case op_anewarray:
1847           case op_instanceof:
1848           case op_checkcast:
1849           case op_invokespecial:
1850           case op_invokestatic:
1851           case op_invokevirtual:
1852             get_short ();
1853             break;
1854 
1855           case op_multianewarray:
1856             get_short ();
1857             get_byte ();
1858             break;
1859 
1860           case op_jsr:
1861             last_was_jsr = true;
1862             // Fall through.
1863           case op_ifeq:
1864           case op_ifne:
1865           case op_iflt:
1866           case op_ifge:
1867           case op_ifgt:
1868           case op_ifle:
1869           case op_if_icmpeq:
1870           case op_if_icmpne:
1871           case op_if_icmplt:
1872           case op_if_icmpge:
1873           case op_if_icmpgt:
1874           case op_if_icmple:
1875           case op_if_acmpeq:
1876           case op_if_acmpne:
1877           case op_ifnull:
1878           case op_ifnonnull:
1879           case op_goto:
1880             note_branch_target (compute_jump (get_short ()), last_was_jsr);
1881             break;
1882 
1883           case op_tableswitch:
1884             {
1885               skip_padding ();
1886               note_branch_target (compute_jump (get_int ()));
1887               jint low = get_int ();
1888               jint hi = get_int ();
1889               if (low > hi)
1890                 verify_fail ("invalid tableswitch", start_PC);
1891               for (int i = low; i <= hi; ++i)
1892                 note_branch_target (compute_jump (get_int ()));
1893             }
1894             break;
1895 
1896           case op_lookupswitch:
1897             {
1898               skip_padding ();
1899               note_branch_target (compute_jump (get_int ()));
1900               int npairs = get_int ();
1901               if (npairs < 0)
1902                 verify_fail ("too few pairs in lookupswitch", start_PC);
1903               while (npairs-- > 0)
1904                 {
1905                   get_int ();
1906                   note_branch_target (compute_jump (get_int ()));
1907                 }
1908             }
1909             break;
1910 
1911           case op_invokeinterface:
1912             get_short ();
1913             get_byte ();
1914             get_byte ();
1915             break;
1916 
1917           case op_wide:
1918             {
1919               opcode = (java_opcode) get_byte ();
1920               get_short ();
1921               if (opcode == op_iinc)
1922                 get_short ();
1923             }
1924             break;
1925 
1926           case op_jsr_w:
1927             last_was_jsr = true;
1928             // Fall through.
1929           case op_goto_w:
1930             note_branch_target (compute_jump (get_int ()), last_was_jsr);
1931             break;
1932 
1933           // These are unused here, but we call them out explicitly
1934           // so that -Wswitch-enum doesn't complain.
1935           case op_putfield_1:
1936           case op_putfield_2:
1937           case op_putfield_4:
1938           case op_putfield_8:
1939           case op_putfield_a:
1940           case op_putstatic_1:
1941           case op_putstatic_2:
1942           case op_putstatic_4:
1943           case op_putstatic_8:
1944           case op_putstatic_a:
1945           case op_getfield_1:
1946           case op_getfield_2s:
1947           case op_getfield_2u:
1948           case op_getfield_4:
1949           case op_getfield_8:
1950           case op_getfield_a:
1951           case op_getstatic_1:
1952           case op_getstatic_2s:
1953           case op_getstatic_2u:
1954           case op_getstatic_4:
1955           case op_getstatic_8:
1956           case op_getstatic_a:
1957           default:
1958             verify_fail ("unrecognized instruction in branch_prepass",
1959                          start_PC);
1960           }
1961 
1962         // See if any previous branch tried to branch to the middle of
1963         // this instruction.
1964         for (int pc = start_PC + 1; pc < PC; ++pc)
1965           {
1966             if ((flags[pc] & FLAG_BRANCH_TARGET))
1967               verify_fail ("branch to middle of instruction", pc);
1968           }
1969       }
1970 
1971     // Verify exception handlers.
1972     for (int i = 0; i < current_method->exc_count; ++i)
1973       {
1974         if (! (flags[exception[i].handler_pc.i] & FLAG_INSN_START))
1975           verify_fail ("exception handler not at instruction start",
1976                        exception[i].handler_pc.i);
1977         if (! (flags[exception[i].start_pc.i] & FLAG_INSN_START))
1978           verify_fail ("exception start not at instruction start",
1979                        exception[i].start_pc.i);
1980         if (exception[i].end_pc.i != current_method->code_length
1981             && ! (flags[exception[i].end_pc.i] & FLAG_INSN_START))
1982           verify_fail ("exception end not at instruction start",
1983                        exception[i].end_pc.i);
1984 
1985         flags[exception[i].handler_pc.i] |= FLAG_BRANCH_TARGET;
1986       }
1987   }
1988 
1989   void check_pool_index (int index)
1990   {
1991     if (index < 0 || index >= current_class->constants.size)
1992       verify_fail ("constant pool index out of range", start_PC);
1993   }
1994 
1995   type check_class_constant (int index)
1996   {
1997     check_pool_index (index);
1998     _Jv_Constants *pool = &current_class->constants;
1999     if (pool->tags[index] == JV_CONSTANT_ResolvedClass)
2000       return type (pool->data[index].clazz);
2001     else if (pool->tags[index] == JV_CONSTANT_Class)
2002       return type (pool->data[index].utf8);
2003     verify_fail ("expected class constant", start_PC);
2004   }
2005 
2006   type check_constant (int index)
2007   {
2008     check_pool_index (index);
2009     _Jv_Constants *pool = &current_class->constants;
2010     if (pool->tags[index] == JV_CONSTANT_ResolvedString
2011         || pool->tags[index] == JV_CONSTANT_String)
2012       return type (&java::lang::String::class$);
2013     else if (pool->tags[index] == JV_CONSTANT_Integer)
2014       return type (int_type);
2015     else if (pool->tags[index] == JV_CONSTANT_Float)
2016       return type (float_type);
2017     verify_fail ("String, int, or float constant expected", start_PC);
2018   }
2019 
2020   type check_wide_constant (int index)
2021   {
2022     check_pool_index (index);
2023     _Jv_Constants *pool = &current_class->constants;
2024     if (pool->tags[index] == JV_CONSTANT_Long)
2025       return type (long_type);
2026     else if (pool->tags[index] == JV_CONSTANT_Double)
2027       return type (double_type);
2028     verify_fail ("long or double constant expected", start_PC);
2029   }
2030 
2031   // Helper for both field and method.  These are laid out the same in
2032   // the constant pool.
2033   type handle_field_or_method (int index, int expected,
2034                                _Jv_Utf8Const **name,
2035                                _Jv_Utf8Const **fmtype)
2036   {
2037     check_pool_index (index);
2038     _Jv_Constants *pool = &current_class->constants;
2039     if (pool->tags[index] != expected)
2040       verify_fail ("didn't see expected constant", start_PC);
2041     // Once we know we have a Fieldref or Methodref we assume that it
2042     // is correctly laid out in the constant pool.  I think the code
2043     // in defineclass.cc guarantees this.
2044     _Jv_ushort class_index, name_and_type_index;
2045     _Jv_loadIndexes (&pool->data[index],
2046                      class_index,
2047                      name_and_type_index);
2048     _Jv_ushort name_index, desc_index;
2049     _Jv_loadIndexes (&pool->data[name_and_type_index],
2050                      name_index, desc_index);
2051 
2052     *name = pool->data[name_index].utf8;
2053     *fmtype = pool->data[desc_index].utf8;
2054 
2055     return check_class_constant (class_index);
2056   }
2057 
2058   // Return field's type, compute class' type if requested.
2059   type check_field_constant (int index, type *class_type = NULL)
2060   {
2061     _Jv_Utf8Const *name, *field_type;
2062     type ct = handle_field_or_method (index,
2063                                       JV_CONSTANT_Fieldref,
2064                                       &name, &field_type);
2065     if (class_type)
2066       *class_type = ct;
2067     if (field_type->data[0] == '[' || field_type->data[0] == 'L')
2068       return type (field_type);
2069     return get_type_val_for_signature (field_type->data[0]);
2070   }
2071 
2072   type check_method_constant (int index, bool is_interface,
2073                               _Jv_Utf8Const **method_name,
2074                               _Jv_Utf8Const **method_signature)
2075   {
2076     return handle_field_or_method (index,
2077                                    (is_interface
2078                                     ? JV_CONSTANT_InterfaceMethodref
2079                                     : JV_CONSTANT_Methodref),
2080                                    method_name, method_signature);
2081   }
2082 
2083   type get_one_type (char *&p)
2084   {
2085     char *start = p;
2086 
2087     int arraycount = 0;
2088     while (*p == '[')
2089       {
2090         ++arraycount;
2091         ++p;
2092       }
2093 
2094     char v = *p++;
2095 
2096     if (v == 'L')
2097       {
2098         while (*p != ';')
2099           ++p;
2100         ++p;
2101         _Jv_Utf8Const *name = make_utf8_const (start, p - start);
2102         return type (name);
2103       }
2104 
2105     // Casting to jchar here is ok since we are looking at an ASCII
2106     // character.
2107     type_val rt = get_type_val_for_signature (jchar (v));
2108 
2109     if (arraycount == 0)
2110       {
2111         // Callers of this function eventually push their arguments on
2112         // the stack.  So, promote them here.
2113         return type (rt).promote ();
2114       }
2115 
2116     jclass k = construct_primitive_array_type (rt);
2117     while (--arraycount > 0)
2118       k = _Jv_GetArrayClass (k, NULL);
2119     return type (k);
2120   }
2121 
2122   void compute_argument_types (_Jv_Utf8Const *signature,
2123                                type *types)
2124   {
2125     char *p = signature->data;
2126     // Skip `('.
2127     ++p;
2128 
2129     int i = 0;
2130     while (*p != ')')
2131       types[i++] = get_one_type (p);
2132   }
2133 
2134   type compute_return_type (_Jv_Utf8Const *signature)
2135   {
2136     char *p = signature->data;
2137     while (*p != ')')
2138       ++p;
2139     ++p;
2140     return get_one_type (p);
2141   }
2142 
2143   void check_return_type (type onstack)
2144   {
2145     type rt = compute_return_type (current_method->self->signature);
2146     if (! rt.compatible (onstack, this))
2147       verify_fail ("incompatible return type");
2148   }
2149 
2150   // Initialize the stack for the new method.  Returns true if this
2151   // method is an instance initializer.
2152   bool initialize_stack ()
2153   {
2154     int var = 0;
2155     bool is_init = _Jv_equalUtf8Consts (current_method->self->name,
2156                                         gcj::init_name);
2157     bool is_clinit = _Jv_equalUtf8Consts (current_method->self->name,
2158                                           gcj::clinit_name);
2159 
2160     using namespace java::lang::reflect;
2161     if (! Modifier::isStatic (current_method->self->accflags))
2162       {
2163         type kurr (current_class);
2164         if (is_init)
2165           {
2166             kurr.set_uninitialized (type::SELF, this);
2167             is_init = true;
2168           }
2169         else if (is_clinit)
2170           verify_fail ("<clinit> method must be static");
2171         set_variable (0, kurr);
2172         current_state->set_this_type (kurr);
2173         ++var;
2174       }
2175     else
2176       {
2177         if (is_init)
2178           verify_fail ("<init> method must be non-static");
2179       }
2180 
2181     // We have to handle wide arguments specially here.
2182     int arg_count = _Jv_count_arguments (current_method->self->signature);
2183     type arg_types[arg_count];
2184     compute_argument_types (current_method->self->signature, arg_types);
2185     for (int i = 0; i < arg_count; ++i)
2186       {
2187         set_variable (var, arg_types[i]);
2188         ++var;
2189         if (arg_types[i].iswide ())
2190           ++var;
2191       }
2192 
2193     return is_init;
2194   }
2195 
2196   void verify_instructions_0 ()
2197   {
2198     current_state = new state (current_method->max_stack,
2199                                current_method->max_locals);
2200 
2201     PC = 0;
2202     start_PC = 0;
2203 
2204     // True if we are verifying an instance initializer.
2205     bool this_is_init = initialize_stack ();
2206 
2207     states = (state **) _Jv_Malloc (sizeof (state *)
2208                                     * current_method->code_length);
2209     for (int i = 0; i < current_method->code_length; ++i)
2210       states[i] = NULL;
2211 
2212     next_verify_pc = state::NO_NEXT;
2213 
2214     while (true)
2215       {
2216         // If the PC was invalidated, get a new one from the work list.
2217         if (PC == state::NO_NEXT)
2218           {
2219             PC = pop_jump ();
2220             if (PC == state::INVALID)
2221               verify_fail ("can't happen: saw state::INVALID");
2222             if (PC == state::NO_NEXT)
2223               break;
2224             debug_print ("== State pop from pending list\n");
2225             // Set up the current state.
2226             current_state->copy (states[PC], current_method->max_stack,
2227                                  current_method->max_locals);
2228           }
2229         else
2230           {
2231             // Control can't fall off the end of the bytecode.  We
2232             // only need to check this in the fall-through case,
2233             // because branch bounds are checked when they are
2234             // pushed.
2235             if (PC >= current_method->code_length)
2236               verify_fail ("fell off end");
2237 
2238             // We only have to do this checking in the situation where
2239             // control flow falls through from the previous
2240             // instruction.  Otherwise merging is done at the time we
2241             // push the branch.
2242             if (states[PC] != NULL)
2243               {
2244                 // We've already visited this instruction.  So merge
2245                 // the states together.  If this yields no change then
2246                 // we don't have to re-verify.  However, if the new
2247                 // state is an the result of an unmerged `ret', we
2248                 // must continue through it.
2249                 debug_print ("== Fall through merge\n");
2250                 states[PC]->print ("Old", PC, current_method->max_stack,
2251                                    current_method->max_locals);
2252                 current_state->print ("Cur", PC, current_method->max_stack,
2253                                       current_method->max_locals);
2254                 if (! current_state->merge (states[PC], false,
2255                                             current_method->max_locals, this)
2256                     && ! states[PC]->is_unmerged_ret_state (current_method->max_locals))
2257                   {
2258                     debug_print ("== Fall through optimization\n");
2259                     invalidate_pc ();
2260                     continue;
2261                   }
2262                 // Save a copy of it for later.
2263                 states[PC]->copy (current_state, current_method->max_stack,
2264                                   current_method->max_locals);
2265                 current_state->print ("New", PC, current_method->max_stack,
2266                                       current_method->max_locals);
2267               }
2268           }
2269 
2270         // We only have to keep saved state at branch targets.  If
2271         // we're at a branch target and the state here hasn't been set
2272         // yet, we set it now.
2273         if (states[PC] == NULL && (flags[PC] & FLAG_BRANCH_TARGET))
2274           {
2275             states[PC] = new state (current_state, current_method->max_stack,
2276                                     current_method->max_locals);
2277           }
2278 
2279         // Set this before handling exceptions so that debug output is
2280         // sane.
2281         start_PC = PC;
2282 
2283         // Update states for all active exception handlers.  Ordinarily
2284         // there are not many exception handlers.  So we simply run
2285         // through them all.
2286         for (int i = 0; i < current_method->exc_count; ++i)
2287           {
2288             if (PC >= exception[i].start_pc.i && PC < exception[i].end_pc.i)
2289               {
2290                 type handler (&java::lang::Throwable::class$);
2291                 if (exception[i].handler_type.i != 0)
2292                   handler = check_class_constant (exception[i].handler_type.i);
2293                 push_exception_jump (handler, exception[i].handler_pc.i);
2294               }
2295           }
2296 
2297         current_state->print ("   ", PC, current_method->max_stack,
2298                               current_method->max_locals);
2299         java_opcode opcode = (java_opcode) bytecode[PC++];
2300         switch (opcode)
2301           {
2302           case op_nop:
2303             break;
2304 
2305           case op_aconst_null:
2306             push_type (null_type);
2307             break;
2308 
2309           case op_iconst_m1:
2310           case op_iconst_0:
2311           case op_iconst_1:
2312           case op_iconst_2:
2313           case op_iconst_3:
2314           case op_iconst_4:
2315           case op_iconst_5:
2316             push_type (int_type);
2317             break;
2318 
2319           case op_lconst_0:
2320           case op_lconst_1:
2321             push_type (long_type);
2322             break;
2323 
2324           case op_fconst_0:
2325           case op_fconst_1:
2326           case op_fconst_2:
2327             push_type (float_type);
2328             break;
2329 
2330           case op_dconst_0:
2331           case op_dconst_1:
2332             push_type (double_type);
2333             break;
2334 
2335           case op_bipush:
2336             get_byte ();
2337             push_type (int_type);
2338             break;
2339 
2340           case op_sipush:
2341             get_short ();
2342             push_type (int_type);
2343             break;
2344 
2345           case op_ldc:
2346             push_type (check_constant (get_byte ()));
2347             break;
2348           case op_ldc_w:
2349             push_type (check_constant (get_ushort ()));
2350             break;
2351           case op_ldc2_w:
2352             push_type (check_wide_constant (get_ushort ()));
2353             break;
2354 
2355           case op_iload:
2356             push_type (get_variable (get_byte (), int_type));
2357             break;
2358           case op_lload:
2359             push_type (get_variable (get_byte (), long_type));
2360             break;
2361           case op_fload:
2362             push_type (get_variable (get_byte (), float_type));
2363             break;
2364           case op_dload:
2365             push_type (get_variable (get_byte (), double_type));
2366             break;
2367           case op_aload:
2368             push_type (get_variable (get_byte (), reference_type));
2369             break;
2370 
2371           case op_iload_0:
2372           case op_iload_1:
2373           case op_iload_2:
2374           case op_iload_3:
2375             push_type (get_variable (opcode - op_iload_0, int_type));
2376             break;
2377           case op_lload_0:
2378           case op_lload_1:
2379           case op_lload_2:
2380           case op_lload_3:
2381             push_type (get_variable (opcode - op_lload_0, long_type));
2382             break;
2383           case op_fload_0:
2384           case op_fload_1:
2385           case op_fload_2:
2386           case op_fload_3:
2387             push_type (get_variable (opcode - op_fload_0, float_type));
2388             break;
2389           case op_dload_0:
2390           case op_dload_1:
2391           case op_dload_2:
2392           case op_dload_3:
2393             push_type (get_variable (opcode - op_dload_0, double_type));
2394             break;
2395           case op_aload_0:
2396           case op_aload_1:
2397           case op_aload_2:
2398           case op_aload_3:
2399             push_type (get_variable (opcode - op_aload_0, reference_type));
2400             break;
2401           case op_iaload:
2402             pop_type (int_type);
2403             push_type (require_array_type (pop_init_ref (reference_type),
2404                                            int_type));
2405             break;
2406           case op_laload:
2407             pop_type (int_type);
2408             push_type (require_array_type (pop_init_ref (reference_type),
2409                                            long_type));
2410             break;
2411           case op_faload:
2412             pop_type (int_type);
2413             push_type (require_array_type (pop_init_ref (reference_type),
2414                                            float_type));
2415             break;
2416           case op_daload:
2417             pop_type (int_type);
2418             push_type (require_array_type (pop_init_ref (reference_type),
2419                                            double_type));
2420             break;
2421           case op_aaload:
2422             pop_type (int_type);
2423             push_type (require_array_type (pop_init_ref (reference_type),
2424                                            reference_type));
2425             break;
2426           case op_baload:
2427             pop_type (int_type);
2428             require_array_type (pop_init_ref (reference_type), byte_type);
2429             push_type (int_type);
2430             break;
2431           case op_caload:
2432             pop_type (int_type);
2433             require_array_type (pop_init_ref (reference_type), char_type);
2434             push_type (int_type);
2435             break;
2436           case op_saload:
2437             pop_type (int_type);
2438             require_array_type (pop_init_ref (reference_type), short_type);
2439             push_type (int_type);
2440             break;
2441           case op_istore:
2442             set_variable (get_byte (), pop_type (int_type));
2443             break;
2444           case op_lstore: