source: trunk/third/gcc/libjava/verify.cc @ 18474

Revision 18474, 78.3 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18473, which included commits to RCS files with non-trunk default branches.
Line 
1// defineclass.cc - defining a class from .class format.
2
3/* Copyright (C) 2001, 2002  Free Software Foundation
4
5   This file is part of libgcj.
6
7This software is copyrighted work licensed under the terms of the
8Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
9details.  */
10
11// Written by Tom Tromey <tromey@redhat.com>
12
13// Define VERIFY_DEBUG to enable debugging output.
14
15#include <config.h>
16
17#include <jvm.h>
18#include <gcj/cni.h>
19#include <java-insns.h>
20#include <java-interp.h>
21
22#ifdef INTERPRETER
23
24#include <java/lang/Class.h>
25#include <java/lang/VerifyError.h>
26#include <java/lang/Throwable.h>
27#include <java/lang/reflect/Modifier.h>
28#include <java/lang/StringBuffer.h>
29
30#ifdef VERIFY_DEBUG
31#include <stdio.h>
32#endif /* VERIFY_DEBUG */
33
34
35static void debug_print (const char *fmt, ...)
36  __attribute__ ((format (printf, 1, 2)));
37
38static inline void
39debug_print (const char *fmt, ...)
40{
41#ifdef VERIFY_DEBUG
42  va_list ap;
43  va_start (ap, fmt);
44  vfprintf (stderr, fmt, ap);
45  va_end (ap);
46#endif /* VERIFY_DEBUG */
47}
48
49class _Jv_BytecodeVerifier
50{
51private:
52
53  static const int FLAG_INSN_START = 1;
54  static const int FLAG_BRANCH_TARGET = 2;
55
56  struct state;
57  struct type;
58  struct subr_info;
59  struct subr_entry_info;
60  struct linked_utf8;
61
62  // The current PC.
63  int PC;
64  // The PC corresponding to the start of the current instruction.
65  int start_PC;
66
67  // The current state of the stack, locals, etc.
68  state *current_state;
69
70  // We store the state at branch targets, for merging.  This holds
71  // such states.
72  state **states;
73
74  // We keep a linked list of all the PCs which we must reverify.
75  // The link is done using the PC values.  This is the head of the
76  // list.
77  int next_verify_pc;
78
79  // We keep some flags for each instruction.  The values are the
80  // FLAG_* constants defined above.
81  char *flags;
82
83  // We need to keep track of which instructions can call a given
84  // subroutine.  FIXME: this is inefficient.  We keep a linked list
85  // of all calling `jsr's at at each jsr target.
86  subr_info **jsr_ptrs;
87
88  // We keep a linked list of entries which map each `ret' instruction
89  // to its unique subroutine entry point.  We expect that there won't
90  // be many `ret' instructions, so a linked list is ok.
91  subr_entry_info *entry_points;
92
93  // The bytecode itself.
94  unsigned char *bytecode;
95  // The exceptions.
96  _Jv_InterpException *exception;
97
98  // Defining class.
99  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  // This enum holds a list of tags for all the different types we
132  // need to handle.  Reference types are treated specially by the
133  // type class.
134  enum type_val
135  {
136    void_type,
137
138    // The values for primitive types are chosen to correspond to values
139    // specified to newarray.
140    boolean_type = 4,
141    char_type = 5,
142    float_type = 6,
143    double_type = 7,
144    byte_type = 8,
145    short_type = 9,
146    int_type = 10,
147    long_type = 11,
148
149    // Used when overwriting second word of a double or long in the
150    // local variables.  Also used after merging local variable states
151    // to indicate an unusable value.
152    unsuitable_type,
153    return_address_type,
154    continuation_type,
155
156    // There is an obscure special case which requires us to note when
157    // a local variable has not been used by a subroutine.  See
158    // push_jump_merge for more information.
159    unused_by_subroutine_type,
160
161    // Everything after `reference_type' must be a reference type.
162    reference_type,
163    null_type,
164    unresolved_reference_type,
165    uninitialized_reference_type,
166    uninitialized_unresolved_reference_type
167  };
168
169  // Return the type_val corresponding to a primitive signature
170  // character.  For instance `I' returns `int.class'.
171  type_val get_type_val_for_signature (jchar sig)
172  {
173    type_val rt;
174    switch (sig)
175      {
176      case 'Z':
177        rt = boolean_type;
178        break;
179      case 'B':
180        rt = byte_type;
181        break;
182      case 'C':
183        rt = char_type;
184        break;
185      case 'S':
186        rt = short_type;
187        break;
188      case 'I':
189        rt = int_type;
190        break;
191      case 'J':
192        rt = long_type;
193        break;
194      case 'F':
195        rt = float_type;
196        break;
197      case 'D':
198        rt = double_type;
199        break;
200      case 'V':
201        rt = void_type;
202        break;
203      default:
204        verify_fail ("invalid signature");
205      }
206    return rt;
207  }
208
209  // Return the type_val corresponding to a primitive class.
210  type_val get_type_val_for_signature (jclass k)
211  {
212    return get_type_val_for_signature ((jchar) k->method_count);
213  }
214
215  // This is like _Jv_IsAssignableFrom, but it works even if SOURCE or
216  // TARGET haven't been prepared.
217  static bool is_assignable_from_slow (jclass target, jclass source)
218  {
219    // This will terminate when SOURCE==Object.
220    while (true)
221      {
222        if (source == target)
223          return true;
224
225        if (target->isPrimitive () || source->isPrimitive ())
226          return false;
227
228        if (target->isArray ())
229          {
230            if (! source->isArray ())
231              return false;
232            target = target->getComponentType ();
233            source = source->getComponentType ();
234          }
235        else if (target->isInterface ())
236          {
237            for (int i = 0; i < source->interface_count; ++i)
238              {
239                // We use a recursive call because we also need to
240                // check superinterfaces.
241                if (is_assignable_from_slow (target, source->interfaces[i]))
242                    return true;
243              }
244            source = source->getSuperclass ();
245            if (source == NULL)
246              return false;
247          }
248        // We must do this check before we check to see if SOURCE is
249        // an interface.  This way we know that any interface is
250        // assignable to an Object.
251        else if (target == &java::lang::Object::class$)
252          return true;
253        else if (source->isInterface ())
254          {
255            for (int i = 0; i < target->interface_count; ++i)
256              {
257                // We use a recursive call because we also need to
258                // check superinterfaces.
259                if (is_assignable_from_slow (target->interfaces[i], source))
260                  return true;
261              }
262            target = target->getSuperclass ();
263            if (target == NULL)
264              return false;
265          }
266        else if (source == &java::lang::Object::class$)
267          return false;
268        else
269          source = source->getSuperclass ();
270      }
271  }
272
273  // This is used to keep track of which `jsr's correspond to a given
274  // jsr target.
275  struct subr_info
276  {
277    // PC of the instruction just after the jsr.
278    int pc;
279    // Link.
280    subr_info *next;
281  };
282
283  // This is used to keep track of which subroutine entry point
284  // corresponds to which `ret' instruction.
285  struct subr_entry_info
286  {
287    // PC of the subroutine entry point.
288    int pc;
289    // PC of the `ret' instruction.
290    int ret_pc;
291    // Link.
292    subr_entry_info *next;
293  };
294
295  // The `type' class is used to represent a single type in the
296  // verifier.
297  struct type
298  {
299    // The type.
300    type_val key;
301    // Some associated data.
302    union
303    {
304      // For a resolved reference type, this is a pointer to the class.
305      jclass klass;
306      // For other reference types, this it the name of the class.
307      _Jv_Utf8Const *name;
308    } data;
309    // This is used when constructing a new object.  It is the PC of the
310    // `new' instruction which created the object.  We use the special
311    // value -2 to mean that this is uninitialized, and the special
312    // value -1 for the case where the current method is itself the
313    // <init> method.
314    int pc;
315
316    static const int UNINIT = -2;
317    static const int SELF = -1;
318
319    // Basic constructor.
320    type ()
321    {
322      key = unsuitable_type;
323      data.klass = NULL;
324      pc = UNINIT;
325    }
326
327    // Make a new instance given the type tag.  We assume a generic
328    // `reference_type' means Object.
329    type (type_val k)
330    {
331      key = k;
332      data.klass = NULL;
333      if (key == reference_type)
334        data.klass = &java::lang::Object::class$;
335      pc = UNINIT;
336    }
337
338    // Make a new instance given a class.
339    type (jclass klass)
340    {
341      key = reference_type;
342      data.klass = klass;
343      pc = UNINIT;
344    }
345
346    // Make a new instance given the name of a class.
347    type (_Jv_Utf8Const *n)
348    {
349      key = unresolved_reference_type;
350      data.name = n;
351      pc = UNINIT;
352    }
353
354    // Copy constructor.
355    type (const type &t)
356    {
357      key = t.key;
358      data = t.data;
359      pc = t.pc;
360    }
361
362    // These operators are required because libgcj can't link in
363    // -lstdc++.
364    void *operator new[] (size_t bytes)
365    {
366      return _Jv_Malloc (bytes);
367    }
368
369    void operator delete[] (void *mem)
370    {
371      _Jv_Free (mem);
372    }
373
374    type& operator= (type_val k)
375    {
376      key = k;
377      data.klass = NULL;
378      pc = UNINIT;
379      return *this;
380    }
381
382    type& operator= (const type& t)
383    {
384      key = t.key;
385      data = t.data;
386      pc = t.pc;
387      return *this;
388    }
389
390    // Promote a numeric type.
391    type &promote ()
392    {
393      if (key == boolean_type || key == char_type
394          || key == byte_type || key == short_type)
395        key = int_type;
396      return *this;
397    }
398
399    // If *THIS is an unresolved reference type, resolve it.
400    void resolve (_Jv_BytecodeVerifier *verifier)
401    {
402      if (key != unresolved_reference_type
403          && key != uninitialized_unresolved_reference_type)
404        return;
405
406      using namespace java::lang;
407      java::lang::ClassLoader *loader
408        = verifier->current_class->getClassLoader();
409      // We might see either kind of name.  Sigh.
410      if (data.name->data[0] == 'L'
411          && data.name->data[data.name->length - 1] == ';')
412        data.klass = _Jv_FindClassFromSignature (data.name->data, loader);
413      else
414        data.klass = Class::forName (_Jv_NewStringUtf8Const (data.name),
415                                     false, loader);
416      key = (key == unresolved_reference_type
417             ? reference_type
418             : uninitialized_reference_type);
419    }
420
421    // Mark this type as the uninitialized result of `new'.
422    void set_uninitialized (int npc, _Jv_BytecodeVerifier *verifier)
423    {
424      if (key == reference_type)
425        key = uninitialized_reference_type;
426      else if (key == unresolved_reference_type)
427        key = uninitialized_unresolved_reference_type;
428      else
429        verifier->verify_fail ("internal error in type::uninitialized");
430      pc = npc;
431    }
432
433    // Mark this type as now initialized.
434    void set_initialized (int npc)
435    {
436      if (npc != UNINIT && pc == npc
437          && (key == uninitialized_reference_type
438              || key == uninitialized_unresolved_reference_type))
439        {
440          key = (key == uninitialized_reference_type
441                 ? reference_type
442                 : unresolved_reference_type);
443          pc = UNINIT;
444        }
445    }
446
447
448    // Return true if an object of type K can be assigned to a variable
449    // of type *THIS.  Handle various special cases too.  Might modify
450    // *THIS or K.  Note however that this does not perform numeric
451    // promotion.
452    bool compatible (type &k, _Jv_BytecodeVerifier *verifier)
453    {
454      // Any type is compatible with the unsuitable type.
455      if (key == unsuitable_type)
456        return true;
457
458      if (key < reference_type || k.key < reference_type)
459        return key == k.key;
460
461      // The `null' type is convertible to any reference type.
462      // FIXME: is this correct for THIS?
463      if (key == null_type || k.key == null_type)
464        return true;
465
466      // Any reference type is convertible to Object.  This is a special
467      // case so we don't need to unnecessarily resolve a class.
468      if (key == reference_type
469          && data.klass == &java::lang::Object::class$)
470        return true;
471
472      // An initialized type and an uninitialized type are not
473      // compatible.
474      if (isinitialized () != k.isinitialized ())
475        return false;
476
477      // Two uninitialized objects are compatible if either:
478      // * The PCs are identical, or
479      // * One PC is UNINIT.
480      if (! isinitialized ())
481        {
482          if (pc != k.pc && pc != UNINIT && k.pc != UNINIT)
483            return false;
484        }
485
486      // Two unresolved types are equal if their names are the same.
487      if (! isresolved ()
488          && ! k.isresolved ()
489          && _Jv_equalUtf8Consts (data.name, k.data.name))
490        return true;
491
492      // We must resolve both types and check assignability.
493      resolve (verifier);
494      k.resolve (verifier);
495      return is_assignable_from_slow (data.klass, k.data.klass);
496    }
497
498    bool isvoid () const
499    {
500      return key == void_type;
501    }
502
503    bool iswide () const
504    {
505      return key == long_type || key == double_type;
506    }
507
508    // Return number of stack or local variable slots taken by this
509    // type.
510    int depth () const
511    {
512      return iswide () ? 2 : 1;
513    }
514
515    bool isarray () const
516    {
517      // We treat null_type as not an array.  This is ok based on the
518      // current uses of this method.
519      if (key == reference_type)
520        return data.klass->isArray ();
521      else if (key == unresolved_reference_type)
522        return data.name->data[0] == '[';
523      return false;
524    }
525
526    bool isnull () const
527    {
528      return key == null_type;
529    }
530
531    bool isinterface (_Jv_BytecodeVerifier *verifier)
532    {
533      resolve (verifier);
534      if (key != reference_type)
535        return false;
536      return data.klass->isInterface ();
537    }
538
539    bool isabstract (_Jv_BytecodeVerifier *verifier)
540    {
541      resolve (verifier);
542      if (key != reference_type)
543        return false;
544      using namespace java::lang::reflect;
545      return Modifier::isAbstract (data.klass->getModifiers ());
546    }
547
548    // Return the element type of an array.
549    type element_type (_Jv_BytecodeVerifier *verifier)
550    {
551      // FIXME: maybe should do string manipulation here.
552      resolve (verifier);
553      if (key != reference_type)
554        verifier->verify_fail ("programmer error in type::element_type()", -1);
555
556      jclass k = data.klass->getComponentType ();
557      if (k->isPrimitive ())
558        return type (verifier->get_type_val_for_signature (k));
559      return type (k);
560    }
561
562    // Return the array type corresponding to an initialized
563    // reference.  We could expand this to work for other kinds of
564    // types, but currently we don't need to.
565    type to_array (_Jv_BytecodeVerifier *verifier)
566    {
567      // Resolving isn't ideal, because it might force us to load
568      // another class, but it's easy.  FIXME?
569      if (key == unresolved_reference_type)
570        resolve (verifier);
571
572      if (key == reference_type)
573        return type (_Jv_GetArrayClass (data.klass,
574                                        data.klass->getClassLoader ()));
575      else
576        verifier->verify_fail ("internal error in type::to_array()");
577    }
578
579    bool isreference () const
580    {
581      return key >= reference_type;
582    }
583
584    int get_pc () const
585    {
586      return pc;
587    }
588
589    bool isinitialized () const
590    {
591      return (key == reference_type
592              || key == null_type
593              || key == unresolved_reference_type);
594    }
595
596    bool isresolved () const
597    {
598      return (key == reference_type
599              || key == null_type
600              || key == uninitialized_reference_type);
601    }
602
603    void verify_dimensions (int ndims, _Jv_BytecodeVerifier *verifier)
604    {
605      // The way this is written, we don't need to check isarray().
606      if (key == reference_type)
607        {
608          jclass k = data.klass;
609          while (k->isArray () && ndims > 0)
610            {
611              k = k->getComponentType ();
612              --ndims;
613            }
614        }
615      else
616        {
617          // We know KEY == unresolved_reference_type.
618          char *p = data.name->data;
619          while (*p++ == '[' && ndims-- > 0)
620            ;
621        }
622
623      if (ndims > 0)
624        verifier->verify_fail ("array type has fewer dimensions than required");
625    }
626
627    // Merge OLD_TYPE into this.  On error throw exception.
628    bool merge (type& old_type, bool local_semantics,
629                _Jv_BytecodeVerifier *verifier)
630    {
631      bool changed = false;
632      bool refo = old_type.isreference ();
633      bool refn = isreference ();
634      if (refo && refn)
635        {
636          if (old_type.key == null_type)
637            ;
638          else if (key == null_type)
639            {
640              *this = old_type;
641              changed = true;
642            }
643          else if (isinitialized () != old_type.isinitialized ())
644            verifier->verify_fail ("merging initialized and uninitialized types");
645          else
646            {
647              if (! isinitialized ())
648                {
649                  if (pc == UNINIT)
650                    pc = old_type.pc;
651                  else if (old_type.pc == UNINIT)
652                    ;
653                  else if (pc != old_type.pc)
654                    verifier->verify_fail ("merging different uninitialized types");
655                }
656
657              if (! isresolved ()
658                  && ! old_type.isresolved ()
659                  && _Jv_equalUtf8Consts (data.name, old_type.data.name))
660                {
661                  // Types are identical.
662                }
663              else
664                {
665                  resolve (verifier);
666                  old_type.resolve (verifier);
667
668                  jclass k = data.klass;
669                  jclass oldk = old_type.data.klass;
670
671                  int arraycount = 0;
672                  while (k->isArray () && oldk->isArray ())
673                    {
674                      ++arraycount;
675                      k = k->getComponentType ();
676                      oldk = oldk->getComponentType ();
677                    }
678
679                  // Ordinarily this terminates when we hit Object...
680                  while (k != NULL)
681                    {
682                      if (is_assignable_from_slow (k, oldk))
683                        break;
684                      k = k->getSuperclass ();
685                      changed = true;
686                    }
687                  // ... but K could have been an interface, in which
688                  // case we'll end up here.  We just convert this
689                  // into Object.
690                  if (k == NULL)
691                    k = &java::lang::Object::class$;
692
693                  if (changed)
694                    {
695                      while (arraycount > 0)
696                        {
697                          java::lang::ClassLoader *loader
698                            = verifier->current_class->getClassLoader();
699                          k = _Jv_GetArrayClass (k, loader);
700                          --arraycount;
701                        }
702                      data.klass = k;
703                    }
704                }
705            }
706        }
707      else if (refo || refn || key != old_type.key)
708        {
709          if (local_semantics)
710            {
711              // If we're merging into an "unused" slot, then we
712              // simply accept whatever we're merging from.
713              if (key == unused_by_subroutine_type)
714                {
715                  *this = old_type;
716                  changed = true;
717                }
718              else if (old_type.key == unused_by_subroutine_type)
719                {
720                  // Do nothing.
721                }
722              // If we already have an `unsuitable' type, then we
723              // don't need to change again.
724              else if (key != unsuitable_type)
725                {
726                  key = unsuitable_type;
727                  changed = true;
728                }
729            }
730          else
731            verifier->verify_fail ("unmergeable type");
732        }
733      return changed;
734    }
735
736#ifdef VERIFY_DEBUG
737    void print (void) const
738    {
739      char c = '?';
740      switch (key)
741        {
742        case boolean_type: c = 'Z'; break;
743        case byte_type: c = 'B'; break;
744        case char_type: c = 'C'; break;
745        case short_type: c = 'S'; break;
746        case int_type: c = 'I'; break;
747        case long_type: c = 'J'; break;
748        case float_type: c = 'F'; break;
749        case double_type: c = 'D'; break;
750        case void_type: c = 'V'; break;
751        case unsuitable_type: c = '-'; break;
752        case return_address_type: c = 'r'; break;
753        case continuation_type: c = '+'; break;
754        case unused_by_subroutine_type: c = '_'; break;
755        case reference_type: c = 'L'; break;
756        case null_type: c = '@'; break;
757        case unresolved_reference_type: c = 'l'; break;
758        case uninitialized_reference_type: c = 'U'; break;
759        case uninitialized_unresolved_reference_type: c = 'u'; break;
760        }
761      debug_print ("%c", c);
762    }
763#endif /* VERIFY_DEBUG */
764  };
765
766  // This class holds all the state information we need for a given
767  // location.
768  struct state
769  {
770    // The current top of the stack, in terms of slots.
771    int stacktop;
772    // The current depth of the stack.  This will be larger than
773    // STACKTOP when wide types are on the stack.
774    int stackdepth;
775    // The stack.
776    type *stack;
777    // The local variables.
778    type *locals;
779    // This is used in subroutines to keep track of which local
780    // variables have been accessed.
781    bool *local_changed;
782    // If not 0, then we are in a subroutine.  The value is the PC of
783    // the subroutine's entry point.  We can use 0 as an exceptional
784    // value because PC=0 can never be a subroutine.
785    int subroutine;
786    // This is used to keep a linked list of all the states which
787    // require re-verification.  We use the PC to keep track.
788    int next;
789    // We keep track of the type of `this' specially.  This is used to
790    // ensure that an instance initializer invokes another initializer
791    // on `this' before returning.  We must keep track of this
792    // specially because otherwise we might be confused by code which
793    // assigns to locals[0] (overwriting `this') and then returns
794    // without really initializing.
795    type this_type;
796
797    // INVALID marks a state which is not on the linked list of states
798    // requiring reverification.
799    static const int INVALID = -1;
800    // NO_NEXT marks the state at the end of the reverification list.
801    static const int NO_NEXT = -2;
802
803    // This is used to mark the stack depth at the instruction just
804    // after a `jsr' when we haven't yet processed the corresponding
805    // `ret'.  See handle_jsr_insn for more information.
806    static const int NO_STACK = -1;
807
808    state ()
809      : this_type ()
810    {
811      stack = NULL;
812      locals = NULL;
813      local_changed = NULL;
814    }
815
816    state (int max_stack, int max_locals)
817      : this_type ()
818    {
819      stacktop = 0;
820      stackdepth = 0;
821      stack = new type[max_stack];
822      for (int i = 0; i < max_stack; ++i)
823        stack[i] = unsuitable_type;
824      locals = new type[max_locals];
825      local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals);
826      for (int i = 0; i < max_locals; ++i)
827        {
828          locals[i] = unsuitable_type;
829          local_changed[i] = false;
830        }
831      next = INVALID;
832      subroutine = 0;
833    }
834
835    state (const state *orig, int max_stack, int max_locals,
836           bool ret_semantics = false)
837    {
838      stack = new type[max_stack];
839      locals = new type[max_locals];
840      local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals);
841      copy (orig, max_stack, max_locals, ret_semantics);
842      next = INVALID;
843    }
844
845    ~state ()
846    {
847      if (stack)
848        delete[] stack;
849      if (locals)
850        delete[] locals;
851      if (local_changed)
852        _Jv_Free (local_changed);
853    }
854
855    void *operator new[] (size_t bytes)
856    {
857      return _Jv_Malloc (bytes);
858    }
859
860    void operator delete[] (void *mem)
861    {
862      _Jv_Free (mem);
863    }
864
865    void *operator new (size_t bytes)
866    {
867      return _Jv_Malloc (bytes);
868    }
869
870    void operator delete (void *mem)
871    {
872      _Jv_Free (mem);
873    }
874
875    void copy (const state *copy, int max_stack, int max_locals,
876               bool ret_semantics = false)
877    {
878      stacktop = copy->stacktop;
879      stackdepth = copy->stackdepth;
880      subroutine = copy->subroutine;
881      for (int i = 0; i < max_stack; ++i)
882        stack[i] = copy->stack[i];
883      for (int i = 0; i < max_locals; ++i)
884        {
885          // See push_jump_merge to understand this case.
886          if (ret_semantics)
887            locals[i] = type (copy->local_changed[i]
888                              ? unsuitable_type
889                              : unused_by_subroutine_type);
890          else
891            locals[i] = copy->locals[i];
892          local_changed[i] = copy->local_changed[i];
893        }
894      this_type = copy->this_type;
895      // Don't modify `next'.
896    }
897
898    // Modify this state to reflect entry to an exception handler.
899    void set_exception (type t, int max_stack)
900    {
901      stackdepth = 1;
902      stacktop = 1;
903      stack[0] = t;
904      for (int i = stacktop; i < max_stack; ++i)
905        stack[i] = unsuitable_type;
906    }
907
908    // Modify this state to reflect entry into a subroutine.
909    void enter_subroutine (int npc, int max_locals)
910    {
911      subroutine = npc;
912      // Mark all items as unchanged.  Each subroutine needs to keep
913      // track of its `changed' state independently.  In the case of
914      // nested subroutines, this information will be merged back into
915      // parent by the `ret'.
916      for (int i = 0; i < max_locals; ++i)
917        local_changed[i] = false;
918    }
919
920    // Merge STATE_OLD into this state.  Destructively modifies this
921    // state.  Returns true if the new state was in fact changed.
922    // Will throw an exception if the states are not mergeable.
923    bool merge (state *state_old, bool ret_semantics,
924                int max_locals, _Jv_BytecodeVerifier *verifier)
925    {
926      bool changed = false;
927
928      // Special handling for `this'.  If one or the other is
929      // uninitialized, then the merge is uninitialized.
930      if (this_type.isinitialized ())
931        this_type = state_old->this_type;
932
933      // Merge subroutine states.  Here we just keep track of what
934      // subroutine we think we're in.  We only check for a merge
935      // (which is invalid) when we see a `ret'.
936      if (subroutine == state_old->subroutine)
937        {
938          // Nothing.
939        }
940      else if (subroutine == 0)
941        {
942          subroutine = state_old->subroutine;
943          changed = true;
944        }
945      else
946        {
947          // If the subroutines differ, indicate that the state
948          // changed.  This is needed to detect when subroutines have
949          // merged.
950          changed = true;
951        }
952
953      // Merge stacks.  Special handling for NO_STACK case.
954      if (state_old->stacktop == NO_STACK)
955        {
956          // Nothing to do in this case; we don't care about modifying
957          // the old state.
958        }
959      else if (stacktop == NO_STACK)
960        {
961          stacktop = state_old->stacktop;
962          stackdepth = state_old->stackdepth;
963          for (int i = 0; i < stacktop; ++i)
964            stack[i] = state_old->stack[i];
965          changed = true;
966        }
967      else if (state_old->stacktop != stacktop)
968        verifier->verify_fail ("stack sizes differ");
969      else
970        {
971          for (int i = 0; i < state_old->stacktop; ++i)
972            {
973              if (stack[i].merge (state_old->stack[i], false, verifier))
974                changed = true;
975            }
976        }
977
978      // Merge local variables.
979      for (int i = 0; i < max_locals; ++i)
980        {
981          // If we're not processing a `ret', then we merge every
982          // local variable.  If we are processing a `ret', then we
983          // only merge locals which changed in the subroutine.  When
984          // processing a `ret', STATE_OLD is the state at the point
985          // of the `ret', and THIS is the state just after the `jsr'.
986          if (! ret_semantics || state_old->local_changed[i])
987            {
988              if (locals[i].merge (state_old->locals[i], true, verifier))
989                {
990                  // Note that we don't call `note_variable' here.
991                  // This change doesn't represent a real change to a
992                  // local, but rather a merge artifact.  If we're in
993                  // a subroutine which is called with two
994                  // incompatible types in a slot that is unused by
995                  // the subroutine, then we don't want to mark that
996                  // variable as having been modified.
997                  changed = true;
998                }
999            }
1000
1001          // If we're in a subroutine, we must compute the union of
1002          // all the changed local variables.
1003          if (state_old->local_changed[i])
1004            note_variable (i);
1005        }
1006
1007      return changed;
1008    }
1009
1010    // Throw an exception if there is an uninitialized object on the
1011    // stack or in a local variable.  EXCEPTION_SEMANTICS controls
1012    // whether we're using backwards-branch or exception-handing
1013    // semantics.
1014    void check_no_uninitialized_objects (int max_locals,
1015                                         _Jv_BytecodeVerifier *verifier,
1016                                         bool exception_semantics = false)
1017    {
1018      if (! exception_semantics)
1019        {
1020          for (int i = 0; i < stacktop; ++i)
1021            if (stack[i].isreference () && ! stack[i].isinitialized ())
1022              verifier->verify_fail ("uninitialized object on stack");
1023        }
1024
1025      for (int i = 0; i < max_locals; ++i)
1026        if (locals[i].isreference () && ! locals[i].isinitialized ())
1027          verifier->verify_fail ("uninitialized object in local variable");
1028
1029      check_this_initialized (verifier);
1030    }
1031
1032    // Ensure that `this' has been initialized.
1033    void check_this_initialized (_Jv_BytecodeVerifier *verifier)
1034    {
1035      if (this_type.isreference () && ! this_type.isinitialized ())
1036        verifier->verify_fail ("`this' is uninitialized");
1037    }
1038
1039    // Set type of `this'.
1040    void set_this_type (const type &k)
1041    {
1042      this_type = k;
1043    }
1044
1045    // Note that a local variable was modified.
1046    void note_variable (int index)
1047    {
1048      if (subroutine > 0)
1049        local_changed[index] = true;
1050    }
1051
1052    // Mark each `new'd object we know of that was allocated at PC as
1053    // initialized.
1054    void set_initialized (int pc, int max_locals)
1055    {
1056      for (int i = 0; i < stacktop; ++i)
1057        stack[i].set_initialized (pc);
1058      for (int i = 0; i < max_locals; ++i)
1059        locals[i].set_initialized (pc);
1060      this_type.set_initialized (pc);
1061    }
1062
1063    // Return true if this state is the unmerged result of a `ret'.
1064    bool is_unmerged_ret_state (int max_locals) const
1065    {
1066      if (stacktop == NO_STACK)
1067        return true;
1068      for (int i = 0; i < max_locals; ++i)
1069        {
1070          if (locals[i].key == unused_by_subroutine_type)
1071            return true;
1072        }
1073      return false;
1074    }
1075
1076#ifdef VERIFY_DEBUG
1077    void print (const char *leader, int pc,
1078                int max_stack, int max_locals) const
1079    {
1080      debug_print ("%s [%4d]:   [stack] ", leader, pc);
1081      int i;
1082      for (i = 0; i < stacktop; ++i)
1083        stack[i].print ();
1084      for (; i < max_stack; ++i)
1085        debug_print (".");
1086      debug_print ("    [local] ");
1087      for (i = 0; i < max_locals; ++i)
1088        {
1089          locals[i].print ();
1090          debug_print (local_changed[i] ? "+" : " ");
1091        }
1092      if (subroutine == 0)
1093        debug_print ("   | None");
1094      else
1095        debug_print ("   | %4d", subroutine);
1096      debug_print (" | %p\n", this);
1097    }
1098#else
1099    inline void print (const char *, int, int, int) const
1100    {
1101    }
1102#endif /* VERIFY_DEBUG */
1103  };
1104
1105  type pop_raw ()
1106  {
1107    if (current_state->stacktop <= 0)
1108      verify_fail ("stack empty");
1109    type r = current_state->stack[--current_state->stacktop];
1110    current_state->stackdepth -= r.depth ();
1111    if (current_state->stackdepth < 0)
1112      verify_fail ("stack empty", start_PC);
1113    return r;
1114  }
1115
1116  type pop32 ()
1117  {
1118    type r = pop_raw ();
1119    if (r.iswide ())
1120      verify_fail ("narrow pop of wide type");
1121    return r;
1122  }
1123
1124  type pop64 ()
1125  {
1126    type r = pop_raw ();
1127    if (! r.iswide ())
1128      verify_fail ("wide pop of narrow type");
1129    return r;
1130  }
1131
1132  type pop_type (type match)
1133  {
1134    match.promote ();
1135    type t = pop_raw ();
1136    if (! match.compatible (t, this))
1137      verify_fail ("incompatible type on stack");
1138    return t;
1139  }
1140
1141  // Pop a reference type or a return address.
1142  type pop_ref_or_return ()
1143  {
1144    type t = pop_raw ();
1145    if (! t.isreference () && t.key != return_address_type)
1146      verify_fail ("expected reference or return address on stack");
1147    return t;
1148  }
1149
1150  void push_type (type t)
1151  {
1152    // If T is a numeric type like short, promote it to int.
1153    t.promote ();
1154
1155    int depth = t.depth ();
1156    if (current_state->stackdepth + depth > current_method->max_stack)
1157      verify_fail ("stack overflow");
1158    current_state->stack[current_state->stacktop++] = t;
1159    current_state->stackdepth += depth;
1160  }
1161
1162  void set_variable (int index, type t)
1163  {
1164    // If T is a numeric type like short, promote it to int.
1165    t.promote ();
1166
1167    int depth = t.depth ();
1168    if (index > current_method->max_locals - depth)
1169      verify_fail ("invalid local variable");
1170    current_state->locals[index] = t;
1171    current_state->note_variable (index);
1172
1173    if (depth == 2)
1174      {
1175        current_state->locals[index + 1] = continuation_type;
1176        current_state->note_variable (index + 1);
1177      }
1178    if (index > 0 && current_state->locals[index - 1].iswide ())
1179      {
1180        current_state->locals[index - 1] = unsuitable_type;
1181        // There's no need to call note_variable here.
1182      }
1183  }
1184
1185  type get_variable (int index, type t)
1186  {
1187    int depth = t.depth ();
1188    if (index > current_method->max_locals - depth)
1189      verify_fail ("invalid local variable");
1190    if (! t.compatible (current_state->locals[index], this))
1191      verify_fail ("incompatible type in local variable");
1192    if (depth == 2)
1193      {
1194        type t (continuation_type);
1195        if (! current_state->locals[index + 1].compatible (t, this))
1196          verify_fail ("invalid local variable");
1197      }
1198    return current_state->locals[index];
1199  }
1200
1201  // Make sure ARRAY is an array type and that its elements are
1202  // compatible with type ELEMENT.  Returns the actual element type.
1203  type require_array_type (type array, type element)
1204  {
1205    // An odd case.  Here we just pretend that everything went ok.  If
1206    // the requested element type is some kind of reference, return
1207    // the null type instead.
1208    if (array.isnull ())
1209      return element.isreference () ? type (null_type) : element;
1210
1211    if (! array.isarray ())
1212      verify_fail ("array required");
1213
1214    type t = array.element_type (this);
1215    if (! element.compatible (t, this))
1216      {
1217        // Special case for byte arrays, which must also be boolean
1218        // arrays.
1219        bool ok = true;
1220        if (element.key == byte_type)
1221          {
1222            type e2 (boolean_type);
1223            ok = e2.compatible (t, this);
1224          }
1225        if (! ok)
1226          verify_fail ("incompatible array element type");
1227      }
1228
1229    // Return T and not ELEMENT, because T might be specialized.
1230    return t;
1231  }
1232
1233  jint get_byte ()
1234  {
1235    if (PC >= current_method->code_length)
1236      verify_fail ("premature end of bytecode");
1237    return (jint) bytecode[PC++] & 0xff;
1238  }
1239
1240  jint get_ushort ()
1241  {
1242    jint b1 = get_byte ();
1243    jint b2 = get_byte ();
1244    return (jint) ((b1 << 8) | b2) & 0xffff;
1245  }
1246
1247  jint get_short ()
1248  {
1249    jint b1 = get_byte ();
1250    jint b2 = get_byte ();
1251    jshort s = (b1 << 8) | b2;
1252    return (jint) s;
1253  }
1254
1255  jint get_int ()
1256  {
1257    jint b1 = get_byte ();
1258    jint b2 = get_byte ();
1259    jint b3 = get_byte ();
1260    jint b4 = get_byte ();
1261    return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
1262  }
1263
1264  int compute_jump (int offset)
1265  {
1266    int npc = start_PC + offset;
1267    if (npc < 0 || npc >= current_method->code_length)
1268      verify_fail ("branch out of range", start_PC);
1269    return npc;
1270  }
1271
1272  // Merge the indicated state into the state at the branch target and
1273  // schedule a new PC if there is a change.  If RET_SEMANTICS is
1274  // true, then we are merging from a `ret' instruction into the
1275  // instruction after a `jsr'.  This is a special case with its own
1276  // modified semantics.
1277  void push_jump_merge (int npc, state *nstate, bool ret_semantics = false)
1278  {
1279    bool changed = true;
1280    if (states[npc] == NULL)
1281      {
1282        // There's a weird situation here.  If are examining the
1283        // branch that results from a `ret', and there is not yet a
1284        // state available at the branch target (the instruction just
1285        // after the `jsr'), then we have to construct a special kind
1286        // of state at that point for future merging.  This special
1287        // state has the type `unused_by_subroutine_type' in each slot
1288        // which was not modified by the subroutine.
1289        states[npc] = new state (nstate, current_method->max_stack,
1290                                 current_method->max_locals, ret_semantics);
1291        debug_print ("== New state in push_jump_merge\n");
1292        states[npc]->print ("New", npc, current_method->max_stack,
1293                            current_method->max_locals);
1294      }
1295    else
1296      {
1297        debug_print ("== Merge states in push_jump_merge\n");
1298        nstate->print ("Frm", start_PC, current_method->max_stack,
1299                       current_method->max_locals);
1300        states[npc]->print (" To", npc, current_method->max_stack,
1301                            current_method->max_locals);
1302        changed = states[npc]->merge (nstate, ret_semantics,
1303                                      current_method->max_locals, this);
1304        states[npc]->print ("New", npc, current_method->max_stack,
1305                            current_method->max_locals);
1306      }
1307
1308    if (changed && states[npc]->next == state::INVALID)
1309      {
1310        // The merge changed the state, and the new PC isn't yet on our
1311        // list of PCs to re-verify.
1312        states[npc]->next = next_verify_pc;
1313        next_verify_pc = npc;
1314      }
1315  }
1316
1317  void push_jump (int offset)
1318  {
1319    int npc = compute_jump (offset);
1320    if (npc < PC)
1321      current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1322    push_jump_merge (npc, current_state);
1323  }
1324
1325  void push_exception_jump (type t, int pc)
1326  {
1327    current_state->check_no_uninitialized_objects (current_method->max_locals,
1328                                                   this, true);
1329    state s (current_state, current_method->max_stack,
1330             current_method->max_locals);
1331    if (current_method->max_stack < 1)
1332      verify_fail ("stack overflow at exception handler");
1333    s.set_exception (t, current_method->max_stack);
1334    push_jump_merge (pc, &s);
1335  }
1336
1337  int pop_jump ()
1338  {
1339    int *prev_loc = &next_verify_pc;
1340    int npc = next_verify_pc;
1341    bool skipped = false;
1342
1343    while (npc != state::NO_NEXT)
1344      {
1345        // If the next available PC is an unmerged `ret' state, then
1346        // we aren't yet ready to handle it.  That's because we would
1347        // need all kind of special cases to do so.  So instead we
1348        // defer this jump until after we've processed it via a
1349        // fall-through.  This has to happen because the instruction
1350        // before this one must be a `jsr'.
1351        if (! states[npc]->is_unmerged_ret_state (current_method->max_locals))
1352          {
1353            *prev_loc = states[npc]->next;
1354            states[npc]->next = state::INVALID;
1355            return npc;
1356          }
1357
1358        skipped = true;
1359        prev_loc = &states[npc]->next;
1360        npc = states[npc]->next;
1361      }
1362
1363    // Note that we might have gotten here even when there are
1364    // remaining states to process.  That can happen if we find a
1365    // `jsr' without a `ret'.
1366    return state::NO_NEXT;
1367  }
1368
1369  void invalidate_pc ()
1370  {
1371    PC = state::NO_NEXT;
1372  }
1373
1374  void note_branch_target (int pc, bool is_jsr_target = false)
1375  {
1376    // Don't check `pc <= PC', because we've advanced PC after
1377    // fetching the target and we haven't yet checked the next
1378    // instruction.
1379    if (pc < PC && ! (flags[pc] & FLAG_INSN_START))
1380      verify_fail ("branch not to instruction start", start_PC);
1381    flags[pc] |= FLAG_BRANCH_TARGET;
1382    if (is_jsr_target)
1383      {
1384        // Record the jsr which called this instruction.
1385        subr_info *info = (subr_info *) _Jv_Malloc (sizeof (subr_info));
1386        info->pc = PC;
1387        info->next = jsr_ptrs[pc];
1388        jsr_ptrs[pc] = info;
1389      }
1390  }
1391
1392  void skip_padding ()
1393  {
1394    while ((PC % 4) > 0)
1395      if (get_byte () != 0)
1396        verify_fail ("found nonzero padding byte");
1397  }
1398
1399  // Return the subroutine to which the instruction at PC belongs.
1400  int get_subroutine (int pc)
1401  {
1402    if (states[pc] == NULL)
1403      return 0;
1404    return states[pc]->subroutine;
1405  }
1406
1407  // Do the work for a `ret' instruction.  INDEX is the index into the
1408  // local variables.
1409  void handle_ret_insn (int index)
1410  {
1411    get_variable (index, return_address_type);
1412
1413    int csub = current_state->subroutine;
1414    if (csub == 0)
1415      verify_fail ("no subroutine");
1416
1417    // Check to see if we've merged subroutines.
1418    subr_entry_info *entry;
1419    for (entry = entry_points; entry != NULL; entry = entry->next)
1420      {
1421        if (entry->ret_pc == start_PC)
1422          break;
1423      }
1424    if (entry == NULL)
1425      {
1426        entry = (subr_entry_info *) _Jv_Malloc (sizeof (subr_entry_info));
1427        entry->pc = csub;
1428        entry->ret_pc = start_PC;
1429        entry->next = entry_points;
1430        entry_points = entry;
1431      }
1432    else if (entry->pc != csub)
1433      verify_fail ("subroutines merged");
1434
1435    for (subr_info *subr = jsr_ptrs[csub]; subr != NULL; subr = subr->next)
1436      {
1437        // Temporarily modify the current state so it looks like we're
1438        // in the enclosing context.
1439        current_state->subroutine = get_subroutine (subr->pc);
1440        if (subr->pc < PC)
1441          current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1442        push_jump_merge (subr->pc, current_state, true);
1443      }
1444
1445    current_state->subroutine = csub;
1446    invalidate_pc ();
1447  }
1448
1449  // We're in the subroutine SUB, calling a subroutine at DEST.  Make
1450  // sure this subroutine isn't already on the stack.
1451  void check_nonrecursive_call (int sub, int dest)
1452  {
1453    if (sub == 0)
1454      return;
1455    if (sub == dest)
1456      verify_fail ("recursive subroutine call");
1457    for (subr_info *info = jsr_ptrs[sub]; info != NULL; info = info->next)
1458      check_nonrecursive_call (get_subroutine (info->pc), dest);
1459  }
1460
1461  void handle_jsr_insn (int offset)
1462  {
1463    int npc = compute_jump (offset);
1464
1465    if (npc < PC)
1466      current_state->check_no_uninitialized_objects (current_method->max_locals, this);
1467    check_nonrecursive_call (current_state->subroutine, npc);
1468
1469    // Modify our state as appropriate for entry into a subroutine.
1470    push_type (return_address_type);
1471    push_jump_merge (npc, current_state);
1472    // Clean up.
1473    pop_type (return_address_type);
1474
1475    // On entry to the subroutine, the subroutine number must be set
1476    // and the locals must be marked as cleared.  We do this after
1477    // merging state so that we don't erroneously "notice" a variable
1478    // change merely on entry.
1479    states[npc]->enter_subroutine (npc, current_method->max_locals);
1480
1481    // Indicate that we don't know the stack depth of the instruction
1482    // following the `jsr'.  The idea here is that we need to merge
1483    // the local variable state across the jsr, but the subroutine
1484    // might change the stack depth, so we can't make any assumptions
1485    // about it.  So we have yet another special case.  We know that
1486    // at this point PC points to the instruction after the jsr.
1487
1488    // FIXME: what if we have a jsr at the end of the code, but that
1489    // jsr has no corresponding ret?  Is this verifiable, or is it
1490    // not?  If it is then we need a special case here.
1491    if (PC >= current_method->code_length)
1492      verify_fail ("fell off end");
1493
1494    current_state->stacktop = state::NO_STACK;
1495    push_jump_merge (PC, current_state);
1496    invalidate_pc ();
1497  }
1498
1499  jclass construct_primitive_array_type (type_val prim)
1500  {
1501    jclass k = NULL;
1502    switch (prim)
1503      {
1504      case boolean_type:
1505        k = JvPrimClass (boolean);
1506        break;
1507      case char_type:
1508        k = JvPrimClass (char);
1509        break;
1510      case float_type:
1511        k = JvPrimClass (float);
1512        break;
1513      case double_type:
1514        k = JvPrimClass (double);
1515        break;
1516      case byte_type:
1517        k = JvPrimClass (byte);
1518        break;
1519      case short_type:
1520        k = JvPrimClass (short);
1521        break;
1522      case int_type:
1523        k = JvPrimClass (int);
1524        break;
1525      case long_type:
1526        k = JvPrimClass (long);
1527        break;
1528      default:
1529        verify_fail ("unknown type in construct_primitive_array_type");
1530      }
1531    k = _Jv_GetArrayClass (k, NULL);
1532    return k;
1533  }
1534
1535  // This pass computes the location of branch targets and also
1536  // instruction starts.
1537  void branch_prepass ()
1538  {
1539    flags = (char *) _Jv_Malloc (current_method->code_length);
1540    jsr_ptrs = (subr_info **) _Jv_Malloc (sizeof (subr_info *)
1541                                          * current_method->code_length);
1542
1543    for (int i = 0; i < current_method->code_length; ++i)
1544      {
1545        flags[i] = 0;
1546        jsr_ptrs[i] = NULL;
1547      }
1548
1549    bool last_was_jsr = false;
1550
1551    PC = 0;
1552    while (PC < current_method->code_length)
1553      {
1554        // Set `start_PC' early so that error checking can have the
1555        // correct value.
1556        start_PC = PC;
1557        flags[PC] |= FLAG_INSN_START;
1558
1559        // If the previous instruction was a jsr, then the next
1560        // instruction is a branch target -- the branch being the
1561        // corresponding `ret'.
1562        if (last_was_jsr)
1563          note_branch_target (PC);
1564        last_was_jsr = false;
1565
1566        java_opcode opcode = (java_opcode) bytecode[PC++];
1567        switch (opcode)
1568          {
1569          case op_nop:
1570          case op_aconst_null:
1571          case op_iconst_m1:
1572          case op_iconst_0:
1573          case op_iconst_1:
1574          case op_iconst_2:
1575          case op_iconst_3:
1576          case op_iconst_4:
1577          case op_iconst_5:
1578          case op_lconst_0:
1579          case op_lconst_1:
1580          case op_fconst_0:
1581          case op_fconst_1:
1582          case op_fconst_2:
1583          case op_dconst_0:
1584          case op_dconst_1:
1585          case op_iload_0:
1586          case op_iload_1:
1587          case op_iload_2:
1588          case op_iload_3:
1589          case op_lload_0:
1590          case op_lload_1:
1591          case op_lload_2:
1592          case op_lload_3:
1593          case op_fload_0:
1594          case op_fload_1:
1595          case op_fload_2:
1596          case op_fload_3:
1597          case op_dload_0:
1598          case op_dload_1:
1599          case op_dload_2:
1600          case op_dload_3:
1601          case op_aload_0:
1602          case op_aload_1:
1603          case op_aload_2:
1604          case op_aload_3:
1605          case op_iaload:
1606          case op_laload:
1607          case op_faload:
1608          case op_daload:
1609          case op_aaload:
1610          case op_baload:
1611          case op_caload:
1612          case op_saload:
1613          case op_istore_0:
1614          case op_istore_1:
1615          case op_istore_2:
1616          case op_istore_3:
1617          case op_lstore_0:
1618          case op_lstore_1:
1619          case op_lstore_2:
1620          case op_lstore_3:
1621          case op_fstore_0:
1622          case op_fstore_1:
1623          case op_fstore_2:
1624          case op_fstore_3:
1625          case op_dstore_0:
1626          case op_dstore_1:
1627          case op_dstore_2:
1628          case op_dstore_3:
1629          case op_astore_0:
1630          case op_astore_1:
1631          case op_astore_2:
1632          case op_astore_3:
1633          case op_iastore:
1634          case op_lastore:
1635          case op_fastore:
1636          case op_dastore:
1637          case op_aastore:
1638          case op_bastore:
1639          case op_castore:
1640          case op_sastore:
1641          case op_pop:
1642          case op_pop2:
1643          case op_dup:
1644          case op_dup_x1:
1645          case op_dup_x2:
1646          case op_dup2:
1647          case op_dup2_x1:
1648          case op_dup2_x2:
1649          case op_swap:
1650          case op_iadd:
1651          case op_isub:
1652          case op_imul:
1653          case op_idiv:
1654          case op_irem:
1655          case op_ishl:
1656          case op_ishr:
1657          case op_iushr:
1658          case op_iand:
1659          case op_ior:
1660          case op_ixor:
1661          case op_ladd:
1662          case op_lsub:
1663          case op_lmul:
1664          case op_ldiv:
1665          case op_lrem:
1666          case op_lshl:
1667          case op_lshr:
1668          case op_lushr:
1669          case op_land:
1670          case op_lor:
1671          case op_lxor:
1672          case op_fadd:
1673          case op_fsub:
1674          case op_fmul:
1675          case op_fdiv:
1676          case op_frem:
1677          case op_dadd:
1678          case op_dsub:
1679          case op_dmul:
1680          case op_ddiv:
1681          case op_drem:
1682          case op_ineg:
1683          case op_i2b:
1684          case op_i2c:
1685          case op_i2s:
1686          case op_lneg:
1687          case op_fneg:
1688          case op_dneg:
1689          case op_i2l:
1690          case op_i2f:
1691          case op_i2d:
1692          case op_l2i:
1693          case op_l2f:
1694          case op_l2d:
1695          case op_f2i:
1696          case op_f2l:
1697          case op_f2d:
1698          case op_d2i:
1699          case op_d2l:
1700          case op_d2f:
1701          case op_lcmp:
1702          case op_fcmpl:
1703          case op_fcmpg:
1704          case op_dcmpl:
1705          case op_dcmpg:
1706          case op_monitorenter:
1707          case op_monitorexit:
1708          case op_ireturn:
1709          case op_lreturn:
1710          case op_freturn:
1711          case op_dreturn:
1712          case op_areturn:
1713          case op_return:
1714          case op_athrow:
1715          case op_arraylength:
1716            break;
1717
1718          case op_bipush:
1719          case op_ldc:
1720          case op_iload:
1721          case op_lload:
1722          case op_fload:
1723          case op_dload:
1724          case op_aload:
1725          case op_istore:
1726          case op_lstore:
1727          case op_fstore:
1728          case op_dstore:
1729          case op_astore:
1730          case op_ret:
1731          case op_newarray:
1732            get_byte ();
1733            break;
1734
1735          case op_iinc:
1736          case op_sipush:
1737          case op_ldc_w:
1738          case op_ldc2_w:
1739          case op_getstatic:
1740          case op_getfield:
1741          case op_putfield:
1742          case op_putstatic:
1743          case op_new:
1744          case op_anewarray:
1745          case op_instanceof:
1746          case op_checkcast:
1747          case op_invokespecial:
1748          case op_invokestatic:
1749          case op_invokevirtual:
1750            get_short ();
1751            break;
1752
1753          case op_multianewarray:
1754            get_short ();
1755            get_byte ();
1756            break;
1757
1758          case op_jsr:
1759            last_was_jsr = true;
1760            // Fall through.
1761          case op_ifeq:
1762          case op_ifne:
1763          case op_iflt:
1764          case op_ifge:
1765          case op_ifgt:
1766          case op_ifle:
1767          case op_if_icmpeq:
1768          case op_if_icmpne:
1769          case op_if_icmplt:
1770          case op_if_icmpge:
1771          case op_if_icmpgt:
1772          case op_if_icmple:
1773          case op_if_acmpeq:
1774          case op_if_acmpne:
1775          case op_ifnull:
1776          case op_ifnonnull:
1777          case op_goto:
1778            note_branch_target (compute_jump (get_short ()), last_was_jsr);
1779            break;
1780
1781          case op_tableswitch:
1782            {
1783              skip_padding ();
1784              note_branch_target (compute_jump (get_int ()));
1785              jint low = get_int ();
1786              jint hi = get_int ();
1787              if (low > hi)
1788                verify_fail ("invalid tableswitch", start_PC);
1789              for (int i = low; i <= hi; ++i)
1790                note_branch_target (compute_jump (get_int ()));
1791            }
1792            break;
1793
1794          case op_lookupswitch:
1795            {
1796              skip_padding ();
1797              note_branch_target (compute_jump (get_int ()));
1798              int npairs = get_int ();
1799              if (npairs < 0)
1800                verify_fail ("too few pairs in lookupswitch", start_PC);
1801              while (npairs-- > 0)
1802                {
1803                  get_int ();
1804                  note_branch_target (compute_jump (get_int ()));
1805                }
1806            }
1807            break;
1808
1809          case op_invokeinterface:
1810            get_short ();
1811            get_byte ();
1812            get_byte ();
1813            break;
1814
1815          case op_wide:
1816            {
1817              opcode = (java_opcode) get_byte ();
1818              get_short ();
1819              if (opcode == op_iinc)
1820                get_short ();
1821            }
1822            break;
1823
1824          case op_jsr_w:
1825            last_was_jsr = true;
1826            // Fall through.
1827          case op_goto_w:
1828            note_branch_target (compute_jump (get_int ()), last_was_jsr);
1829            break;
1830
1831          default:
1832            verify_fail ("unrecognized instruction in branch_prepass",
1833                         start_PC);
1834          }
1835
1836        // See if any previous branch tried to branch to the middle of
1837        // this instruction.
1838        for (int pc = start_PC + 1; pc < PC; ++pc)
1839          {
1840            if ((flags[pc] & FLAG_BRANCH_TARGET))
1841              verify_fail ("branch to middle of instruction", pc);
1842          }
1843      }
1844
1845    // Verify exception handlers.
1846    for (int i = 0; i < current_method->exc_count; ++i)
1847      {
1848        if (! (flags[exception[i].handler_pc] & FLAG_INSN_START))
1849          verify_fail ("exception handler not at instruction start",
1850                       exception[i].handler_pc);
1851        if (! (flags[exception[i].start_pc] & FLAG_INSN_START))
1852          verify_fail ("exception start not at instruction start",
1853                       exception[i].start_pc);
1854        if (exception[i].end_pc != current_method->code_length
1855            && ! (flags[exception[i].end_pc] & FLAG_INSN_START))
1856          verify_fail ("exception end not at instruction start",
1857                       exception[i].end_pc);
1858
1859        flags[exception[i].handler_pc] |= FLAG_BRANCH_TARGET;
1860      }
1861  }
1862
1863  void check_pool_index (int index)
1864  {
1865    if (index < 0 || index >= current_class->constants.size)
1866      verify_fail ("constant pool index out of range", start_PC);
1867  }
1868
1869  type check_class_constant (int index)
1870  {
1871    check_pool_index (index);
1872    _Jv_Constants *pool = &current_class->constants;
1873    if (pool->tags[index] == JV_CONSTANT_ResolvedClass)
1874      return type (pool->data[index].clazz);
1875    else if (pool->tags[index] == JV_CONSTANT_Class)
1876      return type (pool->data[index].utf8);
1877    verify_fail ("expected class constant", start_PC);
1878  }
1879
1880  type check_constant (int index)
1881  {
1882    check_pool_index (index);
1883    _Jv_Constants *pool = &current_class->constants;
1884    if (pool->tags[index] == JV_CONSTANT_ResolvedString
1885        || pool->tags[index] == JV_CONSTANT_String)
1886      return type (&java::lang::String::class$);
1887    else if (pool->tags[index] == JV_CONSTANT_Integer)
1888      return type (int_type);
1889    else if (pool->tags[index] == JV_CONSTANT_Float)
1890      return type (float_type);
1891    verify_fail ("String, int, or float constant expected", start_PC);
1892  }
1893
1894  type check_wide_constant (int index)
1895  {
1896    check_pool_index (index);
1897    _Jv_Constants *pool = &current_class->constants;
1898    if (pool->tags[index] == JV_CONSTANT_Long)
1899      return type (long_type);
1900    else if (pool->tags[index] == JV_CONSTANT_Double)
1901      return type (double_type);
1902    verify_fail ("long or double constant expected", start_PC);
1903  }
1904
1905  // Helper for both field and method.  These are laid out the same in
1906  // the constant pool.
1907  type handle_field_or_method (int index, int expected,
1908                               _Jv_Utf8Const **name,
1909                               _Jv_Utf8Const **fmtype)
1910  {
1911    check_pool_index (index);
1912    _Jv_Constants *pool = &current_class->constants;
1913    if (pool->tags[index] != expected)
1914      verify_fail ("didn't see expected constant", start_PC);
1915    // Once we know we have a Fieldref or Methodref we assume that it
1916    // is correctly laid out in the constant pool.  I think the code
1917    // in defineclass.cc guarantees this.
1918    _Jv_ushort class_index, name_and_type_index;
1919    _Jv_loadIndexes (&pool->data[index],
1920                     class_index,
1921                     name_and_type_index);
1922    _Jv_ushort name_index, desc_index;
1923    _Jv_loadIndexes (&pool->data[name_and_type_index],
1924                     name_index, desc_index);
1925
1926    *name = pool->data[name_index].utf8;
1927    *fmtype = pool->data[desc_index].utf8;
1928
1929    return check_class_constant (class_index);
1930  }
1931
1932  // Return field's type, compute class' type if requested.
1933  type check_field_constant (int index, type *class_type = NULL)
1934  {
1935    _Jv_Utf8Const *name, *field_type;
1936    type ct = handle_field_or_method (index,
1937                                      JV_CONSTANT_Fieldref,
1938                                      &name, &field_type);
1939    if (class_type)
1940      *class_type = ct;
1941    if (field_type->data[0] == '[' || field_type->data[0] == 'L')
1942      return type (field_type);
1943    return get_type_val_for_signature (field_type->data[0]);
1944  }
1945
1946  type check_method_constant (int index, bool is_interface,
1947                              _Jv_Utf8Const **method_name,
1948                              _Jv_Utf8Const **method_signature)
1949  {
1950    return handle_field_or_method (index,
1951                                   (is_interface
1952                                    ? JV_CONSTANT_InterfaceMethodref
1953                                    : JV_CONSTANT_Methodref),
1954                                   method_name, method_signature);
1955  }
1956
1957  type get_one_type (char *&p)
1958  {
1959    char *start = p;
1960
1961    int arraycount = 0;
1962    while (*p == '[')
1963      {
1964        ++arraycount;
1965        ++p;
1966      }
1967
1968    char v = *p++;
1969
1970    if (v == 'L')
1971      {
1972        while (*p != ';')
1973          ++p;
1974        ++p;
1975        _Jv_Utf8Const *name = make_utf8_const (start, p - start);
1976        return type (name);
1977      }
1978
1979    // Casting to jchar here is ok since we are looking at an ASCII
1980    // character.
1981    type_val rt = get_type_val_for_signature (jchar (v));
1982
1983    if (arraycount == 0)
1984      {
1985        // Callers of this function eventually push their arguments on
1986        // the stack.  So, promote them here.
1987        return type (rt).promote ();
1988      }
1989
1990    jclass k = construct_primitive_array_type (rt);
1991    while (--arraycount > 0)
1992      k = _Jv_GetArrayClass (k, NULL);
1993    return type (k);
1994  }
1995
1996  void compute_argument_types (_Jv_Utf8Const *signature,
1997                               type *types)
1998  {
1999    char *p = signature->data;
2000    // Skip `('.
2001    ++p;
2002
2003    int i = 0;
2004    while (*p != ')')
2005      types[i++] = get_one_type (p);
2006  }
2007
2008  type compute_return_type (_Jv_Utf8Const *signature)
2009  {
2010    char *p = signature->data;
2011    while (*p != ')')
2012      ++p;
2013    ++p;
2014    return get_one_type (p);
2015  }
2016
2017  void check_return_type (type onstack)
2018  {
2019    type rt = compute_return_type (current_method->self->signature);
2020    if (! rt.compatible (onstack, this))
2021      verify_fail ("incompatible return type");
2022  }
2023
2024  // Initialize the stack for the new method.  Returns true if this
2025  // method is an instance initializer.
2026  bool initialize_stack ()
2027  {
2028    int var = 0;
2029    bool is_init = false;
2030
2031    using namespace java::lang::reflect;
2032    if (! Modifier::isStatic (current_method->self->accflags))
2033      {
2034        type kurr (current_class);
2035        if (_Jv_equalUtf8Consts (current_method->self->name, gcj::init_name))
2036          {
2037            kurr.set_uninitialized (type::SELF, this);
2038            is_init = true;
2039          }
2040        set_variable (0, kurr);
2041        current_state->set_this_type (kurr);
2042        ++var;
2043      }
2044
2045    // We have to handle wide arguments specially here.
2046    int arg_count = _Jv_count_arguments (current_method->self->signature);
2047    type arg_types[arg_count];
2048    compute_argument_types (current_method->self->signature, arg_types);
2049    for (int i = 0; i < arg_count; ++i)
2050      {
2051        set_variable (var, arg_types[i]);
2052        ++var;
2053        if (arg_types[i].iswide ())
2054          ++var;
2055      }
2056
2057    return is_init;
2058  }
2059
2060  void verify_instructions_0 ()
2061  {
2062    current_state = new state (current_method->max_stack,
2063                               current_method->max_locals);
2064
2065    PC = 0;
2066    start_PC = 0;
2067
2068    // True if we are verifying an instance initializer.
2069    bool this_is_init = initialize_stack ();
2070
2071    states = (state **) _Jv_Malloc (sizeof (state *)
2072                                    * current_method->code_length);
2073    for (int i = 0; i < current_method->code_length; ++i)
2074      states[i] = NULL;
2075
2076    next_verify_pc = state::NO_NEXT;
2077
2078    while (true)
2079      {
2080        // If the PC was invalidated, get a new one from the work list.
2081        if (PC == state::NO_NEXT)
2082          {
2083            PC = pop_jump ();
2084            if (PC == state::INVALID)
2085              verify_fail ("can't happen: saw state::INVALID");
2086            if (PC == state::NO_NEXT)
2087              break;
2088            debug_print ("== State pop from pending list\n");
2089            // Set up the current state.
2090            current_state->copy (states[PC], current_method->max_stack,
2091                                 current_method->max_locals);
2092          }
2093        else
2094          {
2095            // Control can't fall off the end of the bytecode.  We
2096            // only need to check this in the fall-through case,
2097            // because branch bounds are checked when they are
2098            // pushed.
2099            if (PC >= current_method->code_length)
2100              verify_fail ("fell off end");
2101
2102            // We only have to do this checking in the situation where
2103            // control flow falls through from the previous
2104            // instruction.  Otherwise merging is done at the time we
2105            // push the branch.
2106            if (states[PC] != NULL)
2107              {
2108                // We've already visited this instruction.  So merge
2109                // the states together.  If this yields no change then
2110                // we don't have to re-verify.  However, if the new
2111                // state is an the result of an unmerged `ret', we
2112                // must continue through it.
2113                debug_print ("== Fall through merge\n");
2114                states[PC]->print ("Old", PC, current_method->max_stack,
2115                                   current_method->max_locals);
2116                current_state->print ("Cur", PC, current_method->max_stack,
2117                                      current_method->max_locals);
2118                if (! current_state->merge (states[PC], false,
2119                                            current_method->max_locals, this)
2120                    && ! states[PC]->is_unmerged_ret_state (current_method->max_locals))
2121                  {
2122                    debug_print ("== Fall through optimization\n");
2123                    invalidate_pc ();
2124                    continue;
2125                  }
2126                // Save a copy of it for later.
2127                states[PC]->copy (current_state, current_method->max_stack,
2128                                  current_method->max_locals);
2129                current_state->print ("New", PC, current_method->max_stack,
2130                                      current_method->max_locals);
2131              }
2132          }
2133
2134        // We only have to keep saved state at branch targets.  If
2135        // we're at a branch target and the state here hasn't been set
2136        // yet, we set it now.
2137        if (states[PC] == NULL && (flags[PC] & FLAG_BRANCH_TARGET))
2138          {
2139            states[PC] = new state (current_state, current_method->max_stack,
2140                                    current_method->max_locals);
2141          }
2142
2143        // Set this before handling exceptions so that debug output is
2144        // sane.
2145        start_PC = PC;
2146
2147        // Update states for all active exception handlers.  Ordinarily
2148        // there are not many exception handlers.  So we simply run
2149        // through them all.
2150        for (int i = 0; i < current_method->exc_count; ++i)
2151          {
2152            if (PC >= exception[i].start_pc && PC < exception[i].end_pc)
2153              {
2154                type handler (&java::lang::Throwable::class$);
2155                if (exception[i].handler_type != 0)
2156                  handler = check_class_constant (exception[i].handler_type);
2157                push_exception_jump (handler, exception[i].handler_pc);
2158              }
2159          }
2160
2161        current_state->print ("   ", PC, current_method->max_stack,
2162                              current_method->max_locals);
2163        java_opcode opcode = (java_opcode) bytecode[PC++];
2164        switch (opcode)
2165          {
2166          case op_nop:
2167            break;
2168
2169          case op_aconst_null:
2170            push_type (null_type);
2171            break;
2172
2173          case op_iconst_m1:
2174          case op_iconst_0:
2175          case op_iconst_1:
2176          case op_iconst_2:
2177          case op_iconst_3:
2178          case op_iconst_4:
2179          case op_iconst_5:
2180            push_type (int_type);
2181            break;
2182
2183          case op_lconst_0:
2184          case op_lconst_1:
2185            push_type (long_type);
2186            break;
2187
2188          case op_fconst_0:
2189          case op_fconst_1:
2190          case op_fconst_2:
2191            push_type (float_type);
2192            break;
2193
2194          case op_dconst_0:
2195          case op_dconst_1:
2196            push_type (double_type);
2197            break;
2198
2199          case op_bipush:
2200            get_byte ();
2201            push_type (int_type);
2202            break;
2203
2204          case op_sipush:
2205            get_short ();
2206            push_type (int_type);
2207            break;
2208
2209          case op_ldc:
2210            push_type (check_constant (get_byte ()));
2211            break;
2212          case op_ldc_w:
2213            push_type (check_constant (get_ushort ()));
2214            break;
2215          case op_ldc2_w:
2216            push_type (check_wide_constant (get_ushort ()));
2217            break;
2218
2219          case op_iload:
2220            push_type (get_variable (get_byte (), int_type));
2221            break;
2222          case op_lload:
2223            push_type (get_variable (get_byte (), long_type));
2224            break;
2225          case op_fload:
2226            push_type (get_variable (get_byte (), float_type));
2227            break;
2228          case op_dload:
2229            push_type (get_variable (get_byte (), double_type));
2230            break;
2231          case op_aload:
2232            push_type (get_variable (get_byte (), reference_type));
2233            break;
2234
2235          case op_iload_0:
2236          case op_iload_1:
2237          case op_iload_2:
2238          case op_iload_3:
2239            push_type (get_variable (opcode - op_iload_0, int_type));
2240            break;
2241          case op_lload_0:
2242          case op_lload_1:
2243          case op_lload_2:
2244          case op_lload_3:
2245            push_type (get_variable (opcode - op_lload_0, long_type));
2246            break;
2247          case op_fload_0:
2248          case op_fload_1:
2249          case op_fload_2:
2250          case op_fload_3:
2251            push_type (get_variable (opcode - op_fload_0, float_type));
2252            break;
2253          case op_dload_0:
2254          case op_dload_1:
2255          case op_dload_2:
2256          case op_dload_3:
2257            push_type (get_variable (opcode - op_dload_0, double_type));
2258            break;
2259          case op_aload_0:
2260          case op_aload_1:
2261          case op_aload_2:
2262          case op_aload_3:
2263            push_type (get_variable (opcode - op_aload_0, reference_type));
2264            break;
2265          case op_iaload:
2266            pop_type (int_type);
2267            push_type (require_array_type (pop_type (reference_type),
2268                                           int_type));
2269            break;
2270          case op_laload:
2271            pop_type (int_type);
2272            push_type (require_array_type (pop_type (reference_type),
2273                                           long_type));
2274            break;
2275          case op_faload:
2276            pop_type (int_type);
2277            push_type (require_array_type (pop_type (reference_type),
2278                                           float_type));
2279            break;
2280          case op_daload:
2281            pop_type (int_type);
2282            push_type (require_array_type (pop_type (reference_type),
2283                                           double_type));
2284            break;
2285          case op_aaload:
2286            pop_type (int_type);
2287            push_type (require_array_type (pop_type (reference_type),
2288                                           reference_type));
2289            break;
2290          case op_baload:
2291            pop_type (int_type);
2292            require_array_type (pop_type (reference_type), byte_type);
2293            push_type (int_type);
2294            break;
2295          case op_caload:
2296            pop_type (int_type);
2297            require_array_type (pop_type (reference_type), char_type);
2298            push_type (int_type);
2299            break;
2300          case op_saload:
2301            pop_type (int_type);
2302            require_array_type (pop_type (reference_type), short_type);
2303            push_type (int_type);
2304            break;
2305          case op_istore:
2306            set_variable (get_byte (), pop_type (int_type));
2307            break;
2308          case op_lstore:
2309            set_variable (get_byte (), pop_type (long_type));
2310            break;
2311          case op_fstore:
2312            set_variable (get_byte (), pop_type (float_type));
2313            break;
2314          case op_dstore:
2315            set_variable (get_byte (), pop_type (double_type));
2316            break;
2317          case op_astore:
2318            set_variable (get_byte (), pop_ref_or_return ());
2319            break;
2320          case op_istore_0:
2321          case op_istore_1:
2322          case op_istore_2:
2323          case op_istore_3:
2324            set_variable (opcode - op_istore_0, pop_type (int_type));
2325            break;
2326          case op_lstore_0:
2327          case op_lstore_1:
2328          case op_lstore_2:
2329          case op_lstore_3:
2330            set_variable (opcode - op_lstore_0, pop_type (long_type));
2331            break;
2332          case op_fstore_0:
2333          case op_fstore_1:
2334          case op_fstore_2:
2335          case op_fstore_3:
2336            set_variable (opcode - op_fstore_0, pop_type (float_type));
2337            break;
2338          case op_dstore_0:
2339          case op_dstore_1:
2340          case op_dstore_2:
2341          case op_dstore_3:
2342            set_variable (opcode - op_dstore_0, pop_type (double_type));
2343            break;
2344          case op_astore_0:
2345          case op_astore_1:
2346          case op_astore_2:
2347          case op_astore_3:
2348            set_variable (opcode - op_astore_0, pop_ref_or_return ());
2349            break;
2350          case op_iastore:
2351            pop_type (int_type);
2352            pop_type (int_type);
2353            require_array_type (pop_type (reference_type), int_type);
2354            break;
2355          case op_lastore:
2356            pop_type (long_type);
2357            pop_type (int_type);
2358            require_array_type (pop_type (reference_type), long_type);
2359            break;
2360          case op_fastore:
2361            pop_type (float_type);
2362            pop_type (int_type);
2363            require_array_type (pop_type (reference_type), float_type);
2364            break;
2365          case op_dastore:
2366            pop_type (double_type);
2367            pop_type (int_type);
2368            require_array_type (pop_type (reference_type), double_type);
2369            break;
2370          case op_aastore:
2371            pop_type (reference_type);
2372            pop_type (int_type);
2373            require_array_type (pop_type (reference_type), reference_type);
2374            break;
2375          case op_bastore:
2376            pop_type (int_type);
2377            pop_type (int_type);
2378            require_array_type (pop_type (reference_type), byte_type);
2379            break;
2380          case op_castore:
2381            pop_type (int_type);
2382            pop_type (int_type);
2383            require_array_type (pop_type (reference_type), char_type);
2384            break;
2385          case op_sastore:
2386            pop_type (int_type);
2387            pop_type (int_type);
2388            require_array_type (pop_type (reference_type), short_type);
2389            break;
2390          case op_pop:
2391            pop32 ();
2392            break;
2393          case op_pop2:
2394            pop64 ();
2395            break;
2396          case op_dup:
2397            {
2398              type t = pop32 ();
2399              push_type (t);
2400              push_type (t);
2401            }
2402            break;
2403          case op_dup_x1:
2404            {
2405              type t1 = pop32 ();
2406              type t2 = pop32 ();
2407              push_type (t1);
2408              push_type (t2);
2409              push_type (t1);
2410            }
2411            break;
2412          case op_dup_x2:
2413            {
2414              type t1 = pop32 ();
2415              type t2 = pop_raw ();
2416              if (! t2.iswide ())
2417                {
2418                  type t3 = pop32 ();
2419                  push_type (t1);
2420                  push_type (t3);
2421                }
2422              else
2423                push_type (t1);
2424              push_type (t2);
2425              push_type (t1);
2426            }
2427            break;
2428          case op_dup2:
2429            {
2430              type t = pop_raw ();
2431              if (! t.iswide ())
2432                {
2433                  type t2 = pop32 ();
2434                  push_type (t2);
2435                  push_type (t);
2436                  push_type (t2);
2437                }
2438              else
2439                push_type (t);
2440              push_type (t);
2441            }
2442            break;
2443          case op_dup2_x1:
2444            {
2445              type t1 = pop_raw ();
2446              type t2 = pop32 ();
2447              if (! t1.iswide ())
2448                {
2449                  type t3 = pop32 ();
2450                  push_type (t2);
2451                  push_type (t1);
2452                  push_type (t3);
2453                }
2454              else
2455                push_type (t1);
2456              push_type (t2);
2457              push_type (t1);
2458            }
2459            break;
2460          case op_dup2_x2:
2461            {
2462              type t1 = pop_raw ();
2463              if (t1.iswide ())
2464                {
2465                  type t2 = pop_raw ();
2466                  if (t2.iswide ())
2467                    {
2468                      push_type (t1);
2469                      push_type (t2);
2470                    }
2471                  else
2472                    {
2473                      type t3 = pop32 ();
2474                      push_type (t1);
2475                      push_type (t3);
2476                      push_type (t2);
2477                    }
2478                  push_type (t1);
2479                }
2480              else
2481                {
2482                  type t2 = pop32 ();
2483                  type t3 = pop_raw ();
2484                  if (t3.iswide ())
2485                    {
2486                      push_type (t2);
2487                      push_type (t1);
2488                    }
2489                  else
2490                    {
2491                      type t4 = pop32 ();
2492                      push_type (t2);
2493                      push_type (t1);
2494                      push_type (t4);
2495                    }
2496                  push_type (t3);
2497                  push_type (t2);
2498                  push_type (t1);
2499                }
2500            }
2501            break;
2502          case op_swap:
2503            {
2504              type t1 = pop32 ();
2505              type t2 = pop32 ();
2506              push_type (t1);
2507              push_type (t2);
2508            }
2509            break;
2510          case op_iadd:
2511          case op_isub:
2512          case op_imul:
2513          case op_idiv:
2514          case op_irem:
2515          case op_ishl:
2516          case op_ishr:
2517          case op_iushr:
2518          case op_iand:
2519          case op_ior:
2520          case op_ixor:
2521            pop_type (int_type);
2522            push_type (pop_type (int_type));
2523            break;
2524          case op_ladd:
2525          case op_lsub:
2526          case op_lmul:
2527          case op_ldiv:
2528          case op_lrem:
2529          case op_land:
2530          case op_lor:
2531          case op_lxor:
2532            pop_type (long_type);
2533            push_type (pop_type (long_type));
2534            break;
2535          case op_lshl:
2536          case op_lshr:
2537          case op_lushr:
2538            pop_type (int_type);
2539            push_type (pop_type (long_type));
2540            break;
2541          case op_fadd:
2542          case op_fsub:
2543          case op_fmul:
2544          case op_fdiv:
2545          case op_frem:
2546            pop_type (float_type);
2547            push_type (pop_type (float_type));
2548            break;
2549          case op_dadd:
2550          case op_dsub:
2551          case op_dmul:
2552          case op_ddiv:
2553          case op_drem:
2554            pop_type (double_type);
2555            push_type (pop_type (double_type));
2556            break;
2557          case op_ineg:
2558          case op_i2b:
2559          case op_i2c:
2560          case op_i2s:
2561            push_type (pop_type (int_type));
2562            break;
2563          case op_lneg:
2564            push_type (pop_type (long_type));
2565            break;
2566          case op_fneg:
2567            push_type (pop_type (float_type));
2568            break;
2569          case op_dneg:
2570            push_type (pop_type (double_type));
2571            break;
2572          case op_iinc:
2573            get_variable (get_byte (), int_type);
2574            get_byte ();
2575            break;
2576          case op_i2l:
2577            pop_type (int_type);
2578            push_type (long_type);
2579            break;
2580          case op_i2f:
2581            pop_type (int_type);
2582            push_type (float_type);
2583            break;
2584          case op_i2d:
2585            pop_type (int_type);
2586            push_type (double_type);
2587            break;
2588          case op_l2i:
2589            pop_type (long_type);
2590            push_type (int_type);
2591            break;
2592          case op_l2f:
2593            pop_type (long_type);
2594            push_type (float_type);
2595            break;
2596          case op_l2d:
2597            pop_type (long_type);
2598            push_type (double_type);
2599            break;
2600          case op_f2i:
2601            pop_type (float_type);
2602            push_type (int_type);
2603            break;
2604          case op_f2l:
2605            pop_type (float_type);
2606            push_type (long_type);
2607            break;
2608          case op_f2d:
2609            pop_type (float_type);
2610            push_type (double_type);
2611            break;
2612          case op_d2i:
2613            pop_type (double_type);
2614            push_type (int_type);
2615            break;
2616          case op_d2l:
2617            pop_type (double_type);
2618            push_type (long_type);
2619            break;
2620          case op_d2f:
2621            pop_type (double_type);
2622            push_type (float_type);
2623            break;
2624          case op_lcmp:
2625            pop_type (long_type);
2626            pop_type (long_type);
2627            push_type (int_type);
2628            break;
2629          case op_fcmpl:
2630          case op_fcmpg:
2631            pop_type (float_type);
2632            pop_type (float_type);
2633            push_type (int_type);
2634            break;
2635          case op_dcmpl:
2636          case op_dcmpg:
2637            pop_type (double_type);
2638            pop_type (double_type);
2639            push_type (int_type);
2640            break;
2641          case op_ifeq:
2642          case op_ifne:
2643          case op_iflt:
2644          case op_ifge:
2645          case op_ifgt:
2646          case op_ifle:
2647            pop_type (int_type);
2648            push_jump (get_short ());
2649            break;
2650          case op_if_icmpeq:
2651          case op_if_icmpne:
2652          case op_if_icmplt:
2653          case op_if_icmpge:
2654          case op_if_icmpgt:
2655          case op_if_icmple:
2656            pop_type (int_type);
2657            pop_type (int_type);
2658            push_jump (get_short ());
2659            break;
2660          case op_if_acmpeq:
2661          case op_if_acmpne:
2662            pop_type (reference_type);
2663            pop_type (reference_type);
2664            push_jump (get_short ());
2665            break;
2666          case op_goto:
2667            push_jump (get_short ());
2668            invalidate_pc ();
2669            break;
2670          case op_jsr:
2671            handle_jsr_insn (get_short ());
2672            break;
2673          case op_ret:
2674            handle_ret_insn (get_byte ());
2675            break;
2676          case op_tableswitch:
2677            {
2678              pop_type (int_type);
2679              skip_padding ();
2680              push_jump (get_int ());
2681              jint low = get_int ();
2682              jint high = get_int ();
2683              // Already checked LOW -vs- HIGH.
2684              for (int i = low; i <= high; ++i)
2685                push_jump (get_int ());
2686              invalidate_pc ();
2687            }
2688            break;
2689
2690          case op_lookupswitch:
2691            {
2692              pop_type (int_type);
2693              skip_padding ();
2694              push_jump (get_int ());
2695              jint npairs = get_int ();
2696              // Already checked NPAIRS >= 0.
2697              jint lastkey = 0;
2698              for (int i = 0; i < npairs; ++i)
2699                {
2700                  jint key = get_int ();
2701                  if (i > 0 && key <= lastkey)
2702                    verify_fail ("lookupswitch pairs unsorted", start_PC);
2703                  lastkey = key;
2704                  push_jump (get_int ());
2705                }
2706              invalidate_pc ();
2707            }
2708            break;
2709          case op_ireturn:
2710            check_return_type (pop_type (int_type));
2711            invalidate_pc ();
2712            break;
2713          case op_lreturn:
2714            check_return_type (pop_type (long_type));
2715            invalidate_pc ();
2716            break;
2717          case op_freturn:
2718            check_return_type (pop_type (float_type));
2719            invalidate_pc ();
2720            break;
2721          case op_dreturn:
2722            check_return_type (pop_type (double_type));
2723            invalidate_pc ();
2724            break;
2725          case op_areturn:
2726            check_return_type (pop_type (reference_type));
2727            invalidate_pc ();
2728            break;
2729          case op_return:
2730            // We only need to check this when the return type is
2731            // void, because all instance initializers return void.
2732            if (this_is_init)
2733              current_state->check_this_initialized (this);
2734            check_return_type (void_type);
2735            invalidate_pc ();
2736            break;
2737          case op_getstatic:
2738            push_type (check_field_constant (get_ushort ()));
2739            break;
2740          case op_putstatic:
2741            pop_type (check_field_constant (get_ushort ()));
2742            break;
2743          case op_getfield:
2744            {
2745              type klass;
2746              type field = check_field_constant (get_ushort (), &klass);
2747              pop_type (klass);
2748              push_type (field);
2749            }
2750            break;
2751          case op_putfield:
2752            {
2753              type klass;
2754              type field = check_field_constant (get_ushort (), &klass);
2755              pop_type (field);
2756
2757              // We have an obscure special case here: we can use
2758              // `putfield' on a field declared in this class, even if
2759              // `this' has not yet been initialized.
2760              if (! current_state->this_type.isinitialized ()
2761                  && current_state->this_type.pc == type::SELF)
2762                klass.set_uninitialized (type::SELF, this);
2763              pop_type (klass);
2764            }
2765            break;
2766
2767          case op_invokevirtual:
2768          case op_invokespecial:
2769          case op_invokestatic:
2770          case op_invokeinterface:
2771            {
2772              _Jv_Utf8Const *method_name, *method_signature;
2773              type class_type
2774                = check_method_constant (get_ushort (),
2775                                         opcode == op_invokeinterface,
2776                                         &method_name,
2777                                         &method_signature);
2778              // NARGS is only used when we're processing
2779              // invokeinterface.  It is simplest for us to compute it
2780              // here and then verify it later.
2781              int nargs = 0;
2782              if (opcode == op_invokeinterface)
2783                {
2784                  nargs = get_byte ();
2785                  if (get_byte () != 0)
2786                    verify_fail ("invokeinterface dummy byte is wrong");
2787                }
2788
2789              bool is_init = false;
2790              if (_Jv_equalUtf8Consts (method_name, gcj::init_name))
2791                {
2792                  is_init = true;
2793                  if (opcode != op_invokespecial)
2794                    verify_fail ("can't invoke <init>");
2795                }
2796              else if (method_name->data[0] == '<')
2797                verify_fail ("can't invoke method starting with `<'");
2798
2799              // Pop arguments and check types.
2800              int arg_count = _Jv_count_arguments (method_signature);
2801              type arg_types[arg_count];
2802              compute_argument_types (method_signature, arg_types);
2803              for (int i = arg_count - 1; i >= 0; --i)
2804                {
2805                  // This is only used for verifying the byte for
2806                  // invokeinterface.
2807                  nargs -= arg_types[i].depth ();
2808                  pop_type (arg_types[i]);
2809                }
2810
2811              if (opcode == op_invokeinterface
2812                  && nargs != 1)
2813                verify_fail ("wrong argument count for invokeinterface");
2814
2815              if (opcode != op_invokestatic)
2816                {
2817                  type t = class_type;
2818                  if (is_init)
2819                    {
2820                      // In this case the PC doesn't matter.
2821                      t.set_uninitialized (type::UNINIT, this);
2822                    }
2823                  type raw = pop_raw ();
2824                  bool ok = false;
2825                  if (t.compatible (raw, this))
2826                    {
2827                      ok = true;
2828                    }
2829                  else if (opcode == op_invokeinterface)
2830                    {
2831                      // This is a hack.  We might have merged two
2832                      // items and gotten `Object'.  This can happen
2833                      // because we don't keep track of where merges
2834                      // come from.  This is safe as long as the
2835                      // interpreter checks interfaces at runtime.
2836                      type obj (&java::lang::Object::class$);
2837                      ok = raw.compatible (obj, this);
2838                    }
2839
2840                  if (! ok)
2841                    verify_fail ("incompatible type on stack");
2842
2843                  if (is_init)
2844                    current_state->set_initialized (raw.get_pc (),
2845                                                    current_method->max_locals);
2846                }
2847
2848              type rt = compute_return_type (method_signature);
2849              if (! rt.isvoid ())
2850                push_type (rt);
2851            }
2852            break;
2853
2854          case op_new:
2855            {
2856              type t = check_class_constant (get_ushort ());
2857              if (t.isarray () || t.isinterface (this) || t.isabstract (this))
2858                verify_fail ("type is array, interface, or abstract");
2859              t.set_uninitialized (start_PC, this);
2860              push_type (t);
2861            }
2862            break;
2863
2864          case op_newarray:
2865            {
2866              int atype = get_byte ();
2867              // We intentionally have chosen constants to make this
2868              // valid.
2869              if (atype < boolean_type || atype > long_type)
2870                verify_fail ("type not primitive", start_PC);
2871              pop_type (int_type);
2872              push_type (construct_primitive_array_type (type_val (atype)));
2873            }
2874            break;
2875          case op_anewarray:
2876            pop_type (int_type);
2877            push_type (check_class_constant (get_ushort ()).to_array (this));
2878            break;
2879          case op_arraylength:
2880            {
2881              type t = pop_type (reference_type);
2882              if (! t.isarray () && ! t.isnull ())
2883                verify_fail ("array type expected");
2884              push_type (int_type);
2885            }
2886            break;
2887          case op_athrow:
2888            pop_type (type (&java::lang::Throwable::class$));
2889            invalidate_pc ();
2890            break;
2891          case op_checkcast:
2892            pop_type (reference_type);
2893            push_type (check_class_constant (get_ushort ()));
2894            break;
2895          case op_instanceof:
2896            pop_type (reference_type);
2897            check_class_constant (get_ushort ());
2898            push_type (int_type);
2899            break;
2900          case op_monitorenter:
2901            pop_type (reference_type);
2902            break;
2903          case op_monitorexit:
2904            pop_type (reference_type);
2905            break;
2906          case op_wide:
2907            {
2908              switch (get_byte ())
2909                {
2910                case op_iload:
2911                  push_type (get_variable (get_ushort (), int_type));
2912                  break;
2913                case op_lload:
2914                  push_type (get_variable (get_ushort (), long_type));
2915                  break;
2916                case op_fload:
2917                  push_type (get_variable (get_ushort (), float_type));
2918                  break;
2919                case op_dload:
2920                  push_type (get_variable (get_ushort (), double_type));
2921                  break;
2922                case op_aload:
2923                  push_type (get_variable (get_ushort (), reference_type));
2924                  break;
2925                case op_istore:
2926                  set_variable (get_ushort (), pop_type (int_type));
2927                  break;
2928                case op_lstore:
2929                  set_variable (get_ushort (), pop_type (long_type));
2930                  break;
2931                case op_fstore:
2932                  set_variable (get_ushort (), pop_type (float_type));
2933                  break;
2934                case op_dstore:
2935                  set_variable (get_ushort (), pop_type (double_type));
2936                  break;
2937                case op_astore:
2938                  set_variable (get_ushort (), pop_type (reference_type));
2939                  break;
2940                case op_ret:
2941                  handle_ret_insn (get_short ());
2942                  break;
2943                case op_iinc:
2944                  get_variable (get_ushort (), int_type);
2945                  get_short ();
2946                  break;
2947                default:
2948                  verify_fail ("unrecognized wide instruction", start_PC);
2949                }
2950            }
2951            break;
2952          case op_multianewarray:
2953            {
2954              type atype = check_class_constant (get_ushort ());
2955              int dim = get_byte ();
2956              if (dim < 1)
2957                verify_fail ("too few dimensions to multianewarray", start_PC);
2958              atype.verify_dimensions (dim, this);
2959              for (int i = 0; i < dim; ++i)
2960                pop_type (int_type);
2961              push_type (atype);
2962            }
2963            break;
2964          case op_ifnull:
2965          case op_ifnonnull:
2966            pop_type (reference_type);
2967            push_jump (get_short ());
2968            break;
2969          case op_goto_w:
2970            push_jump (get_int ());
2971            invalidate_pc ();
2972            break;
2973          case op_jsr_w:
2974            handle_jsr_insn (get_int ());
2975            break;
2976
2977          default:
2978            // Unrecognized opcode.
2979            verify_fail ("unrecognized instruction in verify_instructions_0",
2980                         start_PC);
2981          }
2982      }
2983  }
2984
2985  __attribute__ ((__noreturn__)) void verify_fail (char *s, jint pc = -1)
2986  {
2987    using namespace java::lang;
2988    StringBuffer *buf = new StringBuffer ();
2989
2990    buf->append (JvNewStringLatin1 ("verification failed"));
2991    if (pc == -1)
2992      pc = start_PC;
2993    if (pc != -1)
2994      {
2995        buf->append (JvNewStringLatin1 (" at PC "));
2996        buf->append (pc);
2997      }
2998
2999    _Jv_InterpMethod *method = current_method;
3000    buf->append (JvNewStringLatin1 (" in "));
3001    buf->append (current_class->getName());
3002    buf->append ((jchar) ':');
3003    buf->append (JvNewStringUTF (method->get_method()->name->data));
3004    buf->append ((jchar) '(');
3005    buf->append (JvNewStringUTF (method->get_method()->signature->data));
3006    buf->append ((jchar) ')');
3007
3008    buf->append (JvNewStringLatin1 (": "));
3009    buf->append (JvNewStringLatin1 (s));
3010    throw new java::lang::VerifyError (buf->toString ());
3011  }
3012
3013public:
3014
3015  void verify_instructions ()
3016  {
3017    branch_prepass ();
3018    verify_instructions_0 ();
3019  }
3020
3021  _Jv_BytecodeVerifier (_Jv_InterpMethod *m)
3022  {
3023    // We just print the text as utf-8.  This is just for debugging
3024    // anyway.
3025    debug_print ("--------------------------------\n");
3026    debug_print ("-- Verifying method `%s'\n", m->self->name->data);
3027
3028    current_method = m;
3029    bytecode = m->bytecode ();
3030    exception = m->exceptions ();
3031    current_class = m->defining_class;
3032
3033    states = NULL;
3034    flags = NULL;
3035    jsr_ptrs = NULL;
3036    utf8_list = NULL;
3037    entry_points = NULL;
3038  }
3039
3040  ~_Jv_BytecodeVerifier ()
3041  {
3042    if (states)
3043      _Jv_Free (states);
3044    if (flags)
3045      _Jv_Free (flags);
3046
3047    if (jsr_ptrs)
3048      {
3049        for (int i = 0; i < current_method->code_length; ++i)
3050          {
3051            if (jsr_ptrs[i] != NULL)
3052              {
3053                subr_info *info = jsr_ptrs[i];
3054                while (info != NULL)
3055                  {
3056                    subr_info *next = info->next;
3057                    _Jv_Free (info);
3058                    info = next;
3059                  }
3060              }
3061          }
3062        _Jv_Free (jsr_ptrs);
3063      }
3064
3065    while (utf8_list != NULL)
3066      {
3067        linked_utf8 *n = utf8_list->next;
3068        _Jv_Free (utf8_list->val);
3069        _Jv_Free (utf8_list);
3070        utf8_list = n;
3071      }
3072
3073    while (entry_points != NULL)
3074      {
3075        subr_entry_info *next = entry_points->next;
3076        _Jv_Free (entry_points);
3077        entry_points = next;
3078      }
3079  }
3080};
3081
3082void
3083_Jv_VerifyMethod (_Jv_InterpMethod *meth)
3084{
3085  _Jv_BytecodeVerifier v (meth);
3086  v.verify_instructions ();
3087}
3088#endif  /* INTERPRETER */
Note: See TracBrowser for help on using the repository browser.