classFileParser.cpp revision 579:0fbdb4381b99
1/*
2 * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25#include "incls/_precompiled.incl"
26#include "incls/_classFileParser.cpp.incl"
27
28// We generally try to create the oops directly when parsing, rather than allocating
29// temporary data structures and copying the bytes twice. A temporary area is only
30// needed when parsing utf8 entries in the constant pool and when parsing line number
31// tables.
32
33// We add assert in debug mode when class format is not checked.
34
35#define JAVA_CLASSFILE_MAGIC              0xCAFEBABE
36#define JAVA_MIN_SUPPORTED_VERSION        45
37#define JAVA_MAX_SUPPORTED_VERSION        51
38#define JAVA_MAX_SUPPORTED_MINOR_VERSION  0
39
40// Used for two backward compatibility reasons:
41// - to check for new additions to the class file format in JDK1.5
42// - to check for bug fixes in the format checker in JDK1.5
43#define JAVA_1_5_VERSION                  49
44
45// Used for backward compatibility reasons:
46// - to check for javac bug fixes that happened after 1.5
47// - also used as the max version when running in jdk6
48#define JAVA_6_VERSION                    50
49
50
51void ClassFileParser::parse_constant_pool_entries(constantPoolHandle cp, int length, TRAPS) {
52  // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize
53  // this function (_current can be allocated in a register, with scalar
54  // replacement of aggregates). The _current pointer is copied back to
55  // stream() when this function returns. DON'T call another method within
56  // this method that uses stream().
57  ClassFileStream* cfs0 = stream();
58  ClassFileStream cfs1 = *cfs0;
59  ClassFileStream* cfs = &cfs1;
60#ifdef ASSERT
61  u1* old_current = cfs0->current();
62#endif
63
64  // Used for batching symbol allocations.
65  const char* names[SymbolTable::symbol_alloc_batch_size];
66  int lengths[SymbolTable::symbol_alloc_batch_size];
67  int indices[SymbolTable::symbol_alloc_batch_size];
68  unsigned int hashValues[SymbolTable::symbol_alloc_batch_size];
69  int names_count = 0;
70
71  // parsing  Index 0 is unused
72  for (int index = 1; index < length; index++) {
73    // Each of the following case guarantees one more byte in the stream
74    // for the following tag or the access_flags following constant pool,
75    // so we don't need bounds-check for reading tag.
76    u1 tag = cfs->get_u1_fast();
77    switch (tag) {
78      case JVM_CONSTANT_Class :
79        {
80          cfs->guarantee_more(3, CHECK);  // name_index, tag/access_flags
81          u2 name_index = cfs->get_u2_fast();
82          cp->klass_index_at_put(index, name_index);
83        }
84        break;
85      case JVM_CONSTANT_Fieldref :
86        {
87          cfs->guarantee_more(5, CHECK);  // class_index, name_and_type_index, tag/access_flags
88          u2 class_index = cfs->get_u2_fast();
89          u2 name_and_type_index = cfs->get_u2_fast();
90          cp->field_at_put(index, class_index, name_and_type_index);
91        }
92        break;
93      case JVM_CONSTANT_Methodref :
94        {
95          cfs->guarantee_more(5, CHECK);  // class_index, name_and_type_index, tag/access_flags
96          u2 class_index = cfs->get_u2_fast();
97          u2 name_and_type_index = cfs->get_u2_fast();
98          cp->method_at_put(index, class_index, name_and_type_index);
99        }
100        break;
101      case JVM_CONSTANT_InterfaceMethodref :
102        {
103          cfs->guarantee_more(5, CHECK);  // class_index, name_and_type_index, tag/access_flags
104          u2 class_index = cfs->get_u2_fast();
105          u2 name_and_type_index = cfs->get_u2_fast();
106          cp->interface_method_at_put(index, class_index, name_and_type_index);
107        }
108        break;
109      case JVM_CONSTANT_String :
110        {
111          cfs->guarantee_more(3, CHECK);  // string_index, tag/access_flags
112          u2 string_index = cfs->get_u2_fast();
113          cp->string_index_at_put(index, string_index);
114        }
115        break;
116      case JVM_CONSTANT_Integer :
117        {
118          cfs->guarantee_more(5, CHECK);  // bytes, tag/access_flags
119          u4 bytes = cfs->get_u4_fast();
120          cp->int_at_put(index, (jint) bytes);
121        }
122        break;
123      case JVM_CONSTANT_Float :
124        {
125          cfs->guarantee_more(5, CHECK);  // bytes, tag/access_flags
126          u4 bytes = cfs->get_u4_fast();
127          cp->float_at_put(index, *(jfloat*)&bytes);
128        }
129        break;
130      case JVM_CONSTANT_Long :
131        // A mangled type might cause you to overrun allocated memory
132        guarantee_property(index+1 < length,
133                           "Invalid constant pool entry %u in class file %s",
134                           index, CHECK);
135        {
136          cfs->guarantee_more(9, CHECK);  // bytes, tag/access_flags
137          u8 bytes = cfs->get_u8_fast();
138          cp->long_at_put(index, bytes);
139        }
140        index++;   // Skip entry following eigth-byte constant, see JVM book p. 98
141        break;
142      case JVM_CONSTANT_Double :
143        // A mangled type might cause you to overrun allocated memory
144        guarantee_property(index+1 < length,
145                           "Invalid constant pool entry %u in class file %s",
146                           index, CHECK);
147        {
148          cfs->guarantee_more(9, CHECK);  // bytes, tag/access_flags
149          u8 bytes = cfs->get_u8_fast();
150          cp->double_at_put(index, *(jdouble*)&bytes);
151        }
152        index++;   // Skip entry following eigth-byte constant, see JVM book p. 98
153        break;
154      case JVM_CONSTANT_NameAndType :
155        {
156          cfs->guarantee_more(5, CHECK);  // name_index, signature_index, tag/access_flags
157          u2 name_index = cfs->get_u2_fast();
158          u2 signature_index = cfs->get_u2_fast();
159          cp->name_and_type_at_put(index, name_index, signature_index);
160        }
161        break;
162      case JVM_CONSTANT_Utf8 :
163        {
164          cfs->guarantee_more(2, CHECK);  // utf8_length
165          u2  utf8_length = cfs->get_u2_fast();
166          u1* utf8_buffer = cfs->get_u1_buffer();
167          assert(utf8_buffer != NULL, "null utf8 buffer");
168          // Got utf8 string, guarantee utf8_length+1 bytes, set stream position forward.
169          cfs->guarantee_more(utf8_length+1, CHECK);  // utf8 string, tag/access_flags
170          cfs->skip_u1_fast(utf8_length);
171
172          // Before storing the symbol, make sure it's legal
173          if (_need_verify) {
174            verify_legal_utf8((unsigned char*)utf8_buffer, utf8_length, CHECK);
175          }
176
177          if (AnonymousClasses && has_cp_patch_at(index)) {
178            Handle patch = clear_cp_patch_at(index);
179            guarantee_property(java_lang_String::is_instance(patch()),
180                               "Illegal utf8 patch at %d in class file %s",
181                               index, CHECK);
182            char* str = java_lang_String::as_utf8_string(patch());
183            // (could use java_lang_String::as_symbol instead, but might as well batch them)
184            utf8_buffer = (u1*) str;
185            utf8_length = (int) strlen(str);
186          }
187
188          unsigned int hash;
189          symbolOop result = SymbolTable::lookup_only((char*)utf8_buffer, utf8_length, hash);
190          if (result == NULL) {
191            names[names_count] = (char*)utf8_buffer;
192            lengths[names_count] = utf8_length;
193            indices[names_count] = index;
194            hashValues[names_count++] = hash;
195            if (names_count == SymbolTable::symbol_alloc_batch_size) {
196              oopFactory::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK);
197              names_count = 0;
198            }
199          } else {
200            cp->symbol_at_put(index, result);
201          }
202        }
203        break;
204      default:
205        classfile_parse_error(
206          "Unknown constant tag %u in class file %s", tag, CHECK);
207        break;
208    }
209  }
210
211  // Allocate the remaining symbols
212  if (names_count > 0) {
213    oopFactory::new_symbols(cp, names_count, names, lengths, indices, hashValues, CHECK);
214  }
215
216  // Copy _current pointer of local copy back to stream().
217#ifdef ASSERT
218  assert(cfs0->current() == old_current, "non-exclusive use of stream()");
219#endif
220  cfs0->set_current(cfs1.current());
221}
222
223bool inline valid_cp_range(int index, int length) { return (index > 0 && index < length); }
224
225constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) {
226  ClassFileStream* cfs = stream();
227  constantPoolHandle nullHandle;
228
229  cfs->guarantee_more(3, CHECK_(nullHandle)); // length, first cp tag
230  u2 length = cfs->get_u2_fast();
231  guarantee_property(
232    length >= 1, "Illegal constant pool size %u in class file %s",
233    length, CHECK_(nullHandle));
234  constantPoolOop constant_pool =
235                      oopFactory::new_constantPool(length,
236                                                   methodOopDesc::IsSafeConc,
237                                                   CHECK_(nullHandle));
238  constantPoolHandle cp (THREAD, constant_pool);
239
240  cp->set_partially_loaded();    // Enables heap verify to work on partial constantPoolOops
241
242  // parsing constant pool entries
243  parse_constant_pool_entries(cp, length, CHECK_(nullHandle));
244
245  int index = 1;  // declared outside of loops for portability
246
247  // first verification pass - validate cross references and fixup class and string constants
248  for (index = 1; index < length; index++) {          // Index 0 is unused
249    switch (cp->tag_at(index).value()) {
250      case JVM_CONSTANT_Class :
251        ShouldNotReachHere();     // Only JVM_CONSTANT_ClassIndex should be present
252        break;
253      case JVM_CONSTANT_Fieldref :
254        // fall through
255      case JVM_CONSTANT_Methodref :
256        // fall through
257      case JVM_CONSTANT_InterfaceMethodref : {
258        if (!_need_verify) break;
259        int klass_ref_index = cp->klass_ref_index_at(index);
260        int name_and_type_ref_index = cp->name_and_type_ref_index_at(index);
261        check_property(valid_cp_range(klass_ref_index, length) &&
262                       is_klass_reference(cp, klass_ref_index),
263                       "Invalid constant pool index %u in class file %s",
264                       klass_ref_index,
265                       CHECK_(nullHandle));
266        check_property(valid_cp_range(name_and_type_ref_index, length) &&
267                       cp->tag_at(name_and_type_ref_index).is_name_and_type(),
268                       "Invalid constant pool index %u in class file %s",
269                       name_and_type_ref_index,
270                       CHECK_(nullHandle));
271        break;
272      }
273      case JVM_CONSTANT_String :
274        ShouldNotReachHere();     // Only JVM_CONSTANT_StringIndex should be present
275        break;
276      case JVM_CONSTANT_Integer :
277        break;
278      case JVM_CONSTANT_Float :
279        break;
280      case JVM_CONSTANT_Long :
281      case JVM_CONSTANT_Double :
282        index++;
283        check_property(
284          (index < length && cp->tag_at(index).is_invalid()),
285          "Improper constant pool long/double index %u in class file %s",
286          index, CHECK_(nullHandle));
287        break;
288      case JVM_CONSTANT_NameAndType : {
289        if (!_need_verify) break;
290        int name_ref_index = cp->name_ref_index_at(index);
291        int signature_ref_index = cp->signature_ref_index_at(index);
292        check_property(
293          valid_cp_range(name_ref_index, length) &&
294            cp->tag_at(name_ref_index).is_utf8(),
295          "Invalid constant pool index %u in class file %s",
296          name_ref_index, CHECK_(nullHandle));
297        check_property(
298          valid_cp_range(signature_ref_index, length) &&
299            cp->tag_at(signature_ref_index).is_utf8(),
300          "Invalid constant pool index %u in class file %s",
301          signature_ref_index, CHECK_(nullHandle));
302        break;
303      }
304      case JVM_CONSTANT_Utf8 :
305        break;
306      case JVM_CONSTANT_UnresolvedClass :         // fall-through
307      case JVM_CONSTANT_UnresolvedClassInError:
308        ShouldNotReachHere();     // Only JVM_CONSTANT_ClassIndex should be present
309        break;
310      case JVM_CONSTANT_ClassIndex :
311        {
312          int class_index = cp->klass_index_at(index);
313          check_property(
314            valid_cp_range(class_index, length) &&
315              cp->tag_at(class_index).is_utf8(),
316            "Invalid constant pool index %u in class file %s",
317            class_index, CHECK_(nullHandle));
318          cp->unresolved_klass_at_put(index, cp->symbol_at(class_index));
319        }
320        break;
321      case JVM_CONSTANT_UnresolvedString :
322        ShouldNotReachHere();     // Only JVM_CONSTANT_StringIndex should be present
323        break;
324      case JVM_CONSTANT_StringIndex :
325        {
326          int string_index = cp->string_index_at(index);
327          check_property(
328            valid_cp_range(string_index, length) &&
329              cp->tag_at(string_index).is_utf8(),
330            "Invalid constant pool index %u in class file %s",
331            string_index, CHECK_(nullHandle));
332          symbolOop sym = cp->symbol_at(string_index);
333          cp->unresolved_string_at_put(index, sym);
334        }
335        break;
336      default:
337        fatal1("bad constant pool tag value %u", cp->tag_at(index).value());
338        ShouldNotReachHere();
339        break;
340    } // end of switch
341  } // end of for
342
343  if (_cp_patches != NULL) {
344    // need to treat this_class specially...
345    assert(AnonymousClasses, "");
346    int this_class_index;
347    {
348      cfs->guarantee_more(8, CHECK_(nullHandle));  // flags, this_class, super_class, infs_len
349      u1* mark = cfs->current();
350      u2 flags         = cfs->get_u2_fast();
351      this_class_index = cfs->get_u2_fast();
352      cfs->set_current(mark);  // revert to mark
353    }
354
355    for (index = 1; index < length; index++) {          // Index 0 is unused
356      if (has_cp_patch_at(index)) {
357        guarantee_property(index != this_class_index,
358                           "Illegal constant pool patch to self at %d in class file %s",
359                           index, CHECK_(nullHandle));
360        patch_constant_pool(cp, index, cp_patch_at(index), CHECK_(nullHandle));
361      }
362    }
363    // Ensure that all the patches have been used.
364    for (index = 0; index < _cp_patches->length(); index++) {
365      guarantee_property(!has_cp_patch_at(index),
366                         "Unused constant pool patch at %d in class file %s",
367                         index, CHECK_(nullHandle));
368    }
369  }
370
371  if (!_need_verify) {
372    return cp;
373  }
374
375  // second verification pass - checks the strings are of the right format.
376  // but not yet to the other entries
377  for (index = 1; index < length; index++) {
378    jbyte tag = cp->tag_at(index).value();
379    switch (tag) {
380      case JVM_CONSTANT_UnresolvedClass: {
381        symbolHandle class_name(THREAD, cp->unresolved_klass_at(index));
382        // check the name, even if _cp_patches will overwrite it
383        verify_legal_class_name(class_name, CHECK_(nullHandle));
384        break;
385      }
386      case JVM_CONSTANT_Fieldref:
387      case JVM_CONSTANT_Methodref:
388      case JVM_CONSTANT_InterfaceMethodref: {
389        int name_and_type_ref_index = cp->name_and_type_ref_index_at(index);
390        // already verified to be utf8
391        int name_ref_index = cp->name_ref_index_at(name_and_type_ref_index);
392        // already verified to be utf8
393        int signature_ref_index = cp->signature_ref_index_at(name_and_type_ref_index);
394        symbolHandle name(THREAD, cp->symbol_at(name_ref_index));
395        symbolHandle signature(THREAD, cp->symbol_at(signature_ref_index));
396        if (tag == JVM_CONSTANT_Fieldref) {
397          verify_legal_field_name(name, CHECK_(nullHandle));
398          verify_legal_field_signature(name, signature, CHECK_(nullHandle));
399        } else {
400          verify_legal_method_name(name, CHECK_(nullHandle));
401          verify_legal_method_signature(name, signature, CHECK_(nullHandle));
402          if (tag == JVM_CONSTANT_Methodref) {
403            // 4509014: If a class method name begins with '<', it must be "<init>".
404            assert(!name.is_null(), "method name in constant pool is null");
405            unsigned int name_len = name->utf8_length();
406            assert(name_len > 0, "bad method name");  // already verified as legal name
407            if (name->byte_at(0) == '<') {
408              if (name() != vmSymbols::object_initializer_name()) {
409                classfile_parse_error(
410                  "Bad method name at constant pool index %u in class file %s",
411                  name_ref_index, CHECK_(nullHandle));
412              }
413            }
414          }
415        }
416        break;
417      }
418    }  // end of switch
419  }  // end of for
420
421  return cp;
422}
423
424
425void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) {
426  assert(AnonymousClasses, "");
427  BasicType patch_type = T_VOID;
428  switch (cp->tag_at(index).value()) {
429
430  case JVM_CONSTANT_UnresolvedClass :
431    // Patching a class means pre-resolving it.
432    // The name in the constant pool is ignored.
433    if (patch->klass() == SystemDictionary::class_klass()) { // %%% java_lang_Class::is_instance
434      guarantee_property(!java_lang_Class::is_primitive(patch()),
435                         "Illegal class patch at %d in class file %s",
436                         index, CHECK);
437      cp->klass_at_put(index, java_lang_Class::as_klassOop(patch()));
438    } else {
439      guarantee_property(java_lang_String::is_instance(patch()),
440                         "Illegal class patch at %d in class file %s",
441                         index, CHECK);
442      symbolHandle name = java_lang_String::as_symbol(patch(), CHECK);
443      cp->unresolved_klass_at_put(index, name());
444    }
445    break;
446
447  case JVM_CONSTANT_UnresolvedString :
448    // Patching a string means pre-resolving it.
449    // The spelling in the constant pool is ignored.
450    // The constant reference may be any object whatever.
451    // If it is not a real interned string, the constant is referred
452    // to as a "pseudo-string", and must be presented to the CP
453    // explicitly, because it may require scavenging.
454    cp->pseudo_string_at_put(index, patch());
455    break;
456
457  case JVM_CONSTANT_Integer : patch_type = T_INT;    goto patch_prim;
458  case JVM_CONSTANT_Float :   patch_type = T_FLOAT;  goto patch_prim;
459  case JVM_CONSTANT_Long :    patch_type = T_LONG;   goto patch_prim;
460  case JVM_CONSTANT_Double :  patch_type = T_DOUBLE; goto patch_prim;
461  patch_prim:
462    {
463      jvalue value;
464      BasicType value_type = java_lang_boxing_object::get_value(patch(), &value);
465      guarantee_property(value_type == patch_type,
466                         "Illegal primitive patch at %d in class file %s",
467                         index, CHECK);
468      switch (value_type) {
469      case T_INT:    cp->int_at_put(index,   value.i); break;
470      case T_FLOAT:  cp->float_at_put(index, value.f); break;
471      case T_LONG:   cp->long_at_put(index,  value.j); break;
472      case T_DOUBLE: cp->double_at_put(index, value.d); break;
473      default:       assert(false, "");
474      }
475    }
476    break;
477
478  default:
479    // %%% TODO: put method handles into CONSTANT_InterfaceMethodref, etc.
480    guarantee_property(!has_cp_patch_at(index),
481                       "Illegal unexpected patch at %d in class file %s",
482                       index, CHECK);
483    return;
484  }
485
486  // On fall-through, mark the patch as used.
487  clear_cp_patch_at(index);
488}
489
490
491
492class NameSigHash: public ResourceObj {
493 public:
494  symbolOop     _name;       // name
495  symbolOop     _sig;        // signature
496  NameSigHash*  _next;       // Next entry in hash table
497};
498
499
500#define HASH_ROW_SIZE 256
501
502unsigned int hash(symbolOop name, symbolOop sig) {
503  unsigned int raw_hash = 0;
504  raw_hash += ((unsigned int)(uintptr_t)name) >> (LogHeapWordSize + 2);
505  raw_hash += ((unsigned int)(uintptr_t)sig) >> LogHeapWordSize;
506
507  return (raw_hash + (unsigned int)(uintptr_t)name) % HASH_ROW_SIZE;
508}
509
510
511void initialize_hashtable(NameSigHash** table) {
512  memset((void*)table, 0, sizeof(NameSigHash*) * HASH_ROW_SIZE);
513}
514
515// Return false if the name/sig combination is found in table.
516// Return true if no duplicate is found. And name/sig is added as a new entry in table.
517// The old format checker uses heap sort to find duplicates.
518// NOTE: caller should guarantee that GC doesn't happen during the life cycle
519// of table since we don't expect symbolOop's to move.
520bool put_after_lookup(symbolOop name, symbolOop sig, NameSigHash** table) {
521  assert(name != NULL, "name in constant pool is NULL");
522
523  // First lookup for duplicates
524  int index = hash(name, sig);
525  NameSigHash* entry = table[index];
526  while (entry != NULL) {
527    if (entry->_name == name && entry->_sig == sig) {
528      return false;
529    }
530    entry = entry->_next;
531  }
532
533  // No duplicate is found, allocate a new entry and fill it.
534  entry = new NameSigHash();
535  entry->_name = name;
536  entry->_sig = sig;
537
538  // Insert into hash table
539  entry->_next = table[index];
540  table[index] = entry;
541
542  return true;
543}
544
545
546objArrayHandle ClassFileParser::parse_interfaces(constantPoolHandle cp,
547                                                 int length,
548                                                 Handle class_loader,
549                                                 Handle protection_domain,
550                                                 PerfTraceTime* vmtimer,
551                                                 symbolHandle class_name,
552                                                 TRAPS) {
553  ClassFileStream* cfs = stream();
554  assert(length > 0, "only called for length>0");
555  objArrayHandle nullHandle;
556  objArrayOop interface_oop = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
557  objArrayHandle interfaces (THREAD, interface_oop);
558
559  int index;
560  for (index = 0; index < length; index++) {
561    u2 interface_index = cfs->get_u2(CHECK_(nullHandle));
562    KlassHandle interf;
563    check_property(
564      valid_cp_range(interface_index, cp->length()) &&
565      is_klass_reference(cp, interface_index),
566      "Interface name has bad constant pool index %u in class file %s",
567      interface_index, CHECK_(nullHandle));
568    if (cp->tag_at(interface_index).is_klass()) {
569      interf = KlassHandle(THREAD, cp->resolved_klass_at(interface_index));
570    } else {
571      symbolHandle unresolved_klass (THREAD, cp->klass_name_at(interface_index));
572
573      // Don't need to check legal name because it's checked when parsing constant pool.
574      // But need to make sure it's not an array type.
575      guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY,
576                         "Bad interface name in class file %s", CHECK_(nullHandle));
577
578      vmtimer->suspend();  // do not count recursive loading twice
579      // Call resolve_super so classcircularity is checked
580      klassOop k = SystemDictionary::resolve_super_or_fail(class_name,
581                    unresolved_klass, class_loader, protection_domain,
582                    false, CHECK_(nullHandle));
583      interf = KlassHandle(THREAD, k);
584      vmtimer->resume();
585
586      if (LinkWellKnownClasses)  // my super type is well known to me
587        cp->klass_at_put(interface_index, interf()); // eagerly resolve
588    }
589
590    if (!Klass::cast(interf())->is_interface()) {
591      THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", nullHandle);
592    }
593    interfaces->obj_at_put(index, interf());
594  }
595
596  if (!_need_verify || length <= 1) {
597    return interfaces;
598  }
599
600  // Check if there's any duplicates in interfaces
601  ResourceMark rm(THREAD);
602  NameSigHash** interface_names = NEW_RESOURCE_ARRAY_IN_THREAD(
603    THREAD, NameSigHash*, HASH_ROW_SIZE);
604  initialize_hashtable(interface_names);
605  bool dup = false;
606  {
607    debug_only(No_Safepoint_Verifier nsv;)
608    for (index = 0; index < length; index++) {
609      klassOop k = (klassOop)interfaces->obj_at(index);
610      symbolOop name = instanceKlass::cast(k)->name();
611      // If no duplicates, add (name, NULL) in hashtable interface_names.
612      if (!put_after_lookup(name, NULL, interface_names)) {
613        dup = true;
614        break;
615      }
616    }
617  }
618  if (dup) {
619    classfile_parse_error("Duplicate interface name in class file %s",
620                          CHECK_(nullHandle));
621  }
622
623  return interfaces;
624}
625
626
627void ClassFileParser::verify_constantvalue(int constantvalue_index, int signature_index, constantPoolHandle cp, TRAPS) {
628  // Make sure the constant pool entry is of a type appropriate to this field
629  guarantee_property(
630    (constantvalue_index > 0 &&
631      constantvalue_index < cp->length()),
632    "Bad initial value index %u in ConstantValue attribute in class file %s",
633    constantvalue_index, CHECK);
634  constantTag value_type = cp->tag_at(constantvalue_index);
635  switch ( cp->basic_type_for_signature_at(signature_index) ) {
636    case T_LONG:
637      guarantee_property(value_type.is_long(), "Inconsistent constant value type in class file %s", CHECK);
638      break;
639    case T_FLOAT:
640      guarantee_property(value_type.is_float(), "Inconsistent constant value type in class file %s", CHECK);
641      break;
642    case T_DOUBLE:
643      guarantee_property(value_type.is_double(), "Inconsistent constant value type in class file %s", CHECK);
644      break;
645    case T_BYTE: case T_CHAR: case T_SHORT: case T_BOOLEAN: case T_INT:
646      guarantee_property(value_type.is_int(), "Inconsistent constant value type in class file %s", CHECK);
647      break;
648    case T_OBJECT:
649      guarantee_property((cp->symbol_at(signature_index)->equals("Ljava/lang/String;", 18)
650                         && (value_type.is_string() || value_type.is_unresolved_string())),
651                         "Bad string initial value in class file %s", CHECK);
652      break;
653    default:
654      classfile_parse_error(
655        "Unable to set initial value %u in class file %s",
656        constantvalue_index, CHECK);
657  }
658}
659
660
661// Parse attributes for a field.
662void ClassFileParser::parse_field_attributes(constantPoolHandle cp,
663                                             u2 attributes_count,
664                                             bool is_static, u2 signature_index,
665                                             u2* constantvalue_index_addr,
666                                             bool* is_synthetic_addr,
667                                             u2* generic_signature_index_addr,
668                                             typeArrayHandle* field_annotations,
669                                             TRAPS) {
670  ClassFileStream* cfs = stream();
671  assert(attributes_count > 0, "length should be greater than 0");
672  u2 constantvalue_index = 0;
673  u2 generic_signature_index = 0;
674  bool is_synthetic = false;
675  u1* runtime_visible_annotations = NULL;
676  int runtime_visible_annotations_length = 0;
677  u1* runtime_invisible_annotations = NULL;
678  int runtime_invisible_annotations_length = 0;
679  while (attributes_count--) {
680    cfs->guarantee_more(6, CHECK);  // attribute_name_index, attribute_length
681    u2 attribute_name_index = cfs->get_u2_fast();
682    u4 attribute_length = cfs->get_u4_fast();
683    check_property(valid_cp_range(attribute_name_index, cp->length()) &&
684                   cp->tag_at(attribute_name_index).is_utf8(),
685                   "Invalid field attribute index %u in class file %s",
686                   attribute_name_index,
687                   CHECK);
688    symbolOop attribute_name = cp->symbol_at(attribute_name_index);
689    if (is_static && attribute_name == vmSymbols::tag_constant_value()) {
690      // ignore if non-static
691      if (constantvalue_index != 0) {
692        classfile_parse_error("Duplicate ConstantValue attribute in class file %s", CHECK);
693      }
694      check_property(
695        attribute_length == 2,
696        "Invalid ConstantValue field attribute length %u in class file %s",
697        attribute_length, CHECK);
698      constantvalue_index = cfs->get_u2(CHECK);
699      if (_need_verify) {
700        verify_constantvalue(constantvalue_index, signature_index, cp, CHECK);
701      }
702    } else if (attribute_name == vmSymbols::tag_synthetic()) {
703      if (attribute_length != 0) {
704        classfile_parse_error(
705          "Invalid Synthetic field attribute length %u in class file %s",
706          attribute_length, CHECK);
707      }
708      is_synthetic = true;
709    } else if (attribute_name == vmSymbols::tag_deprecated()) { // 4276120
710      if (attribute_length != 0) {
711        classfile_parse_error(
712          "Invalid Deprecated field attribute length %u in class file %s",
713          attribute_length, CHECK);
714      }
715    } else if (_major_version >= JAVA_1_5_VERSION) {
716      if (attribute_name == vmSymbols::tag_signature()) {
717        if (attribute_length != 2) {
718          classfile_parse_error(
719            "Wrong size %u for field's Signature attribute in class file %s",
720            attribute_length, CHECK);
721        }
722        generic_signature_index = cfs->get_u2(CHECK);
723      } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) {
724        runtime_visible_annotations_length = attribute_length;
725        runtime_visible_annotations = cfs->get_u1_buffer();
726        assert(runtime_visible_annotations != NULL, "null visible annotations");
727        cfs->skip_u1(runtime_visible_annotations_length, CHECK);
728      } else if (PreserveAllAnnotations && attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
729        runtime_invisible_annotations_length = attribute_length;
730        runtime_invisible_annotations = cfs->get_u1_buffer();
731        assert(runtime_invisible_annotations != NULL, "null invisible annotations");
732        cfs->skip_u1(runtime_invisible_annotations_length, CHECK);
733      } else {
734        cfs->skip_u1(attribute_length, CHECK);  // Skip unknown attributes
735      }
736    } else {
737      cfs->skip_u1(attribute_length, CHECK);  // Skip unknown attributes
738    }
739  }
740
741  *constantvalue_index_addr = constantvalue_index;
742  *is_synthetic_addr = is_synthetic;
743  *generic_signature_index_addr = generic_signature_index;
744  *field_annotations = assemble_annotations(runtime_visible_annotations,
745                                            runtime_visible_annotations_length,
746                                            runtime_invisible_annotations,
747                                            runtime_invisible_annotations_length,
748                                            CHECK);
749  return;
750}
751
752
753// Field allocation types. Used for computing field offsets.
754
755enum FieldAllocationType {
756  STATIC_OOP,           // Oops
757  STATIC_BYTE,          // Boolean, Byte, char
758  STATIC_SHORT,         // shorts
759  STATIC_WORD,          // ints
760  STATIC_DOUBLE,        // long or double
761  STATIC_ALIGNED_DOUBLE,// aligned long or double
762  NONSTATIC_OOP,
763  NONSTATIC_BYTE,
764  NONSTATIC_SHORT,
765  NONSTATIC_WORD,
766  NONSTATIC_DOUBLE,
767  NONSTATIC_ALIGNED_DOUBLE
768};
769
770
771struct FieldAllocationCount {
772  int static_oop_count;
773  int static_byte_count;
774  int static_short_count;
775  int static_word_count;
776  int static_double_count;
777  int nonstatic_oop_count;
778  int nonstatic_byte_count;
779  int nonstatic_short_count;
780  int nonstatic_word_count;
781  int nonstatic_double_count;
782};
783
784typeArrayHandle ClassFileParser::parse_fields(constantPoolHandle cp, bool is_interface,
785                                              struct FieldAllocationCount *fac,
786                                              objArrayHandle* fields_annotations, TRAPS) {
787  ClassFileStream* cfs = stream();
788  typeArrayHandle nullHandle;
789  cfs->guarantee_more(2, CHECK_(nullHandle));  // length
790  u2 length = cfs->get_u2_fast();
791  // Tuples of shorts [access, name index, sig index, initial value index, byte offset, generic signature index]
792  typeArrayOop new_fields = oopFactory::new_permanent_shortArray(length*instanceKlass::next_offset, CHECK_(nullHandle));
793  typeArrayHandle fields(THREAD, new_fields);
794
795  int index = 0;
796  typeArrayHandle field_annotations;
797  for (int n = 0; n < length; n++) {
798    cfs->guarantee_more(8, CHECK_(nullHandle));  // access_flags, name_index, descriptor_index, attributes_count
799
800    AccessFlags access_flags;
801    jint flags = cfs->get_u2_fast() & JVM_RECOGNIZED_FIELD_MODIFIERS;
802    verify_legal_field_modifiers(flags, is_interface, CHECK_(nullHandle));
803    access_flags.set_flags(flags);
804
805    u2 name_index = cfs->get_u2_fast();
806    int cp_size = cp->length();
807    check_property(
808      valid_cp_range(name_index, cp_size) && cp->tag_at(name_index).is_utf8(),
809      "Invalid constant pool index %u for field name in class file %s",
810      name_index, CHECK_(nullHandle));
811    symbolHandle name(THREAD, cp->symbol_at(name_index));
812    verify_legal_field_name(name, CHECK_(nullHandle));
813
814    u2 signature_index = cfs->get_u2_fast();
815    check_property(
816      valid_cp_range(signature_index, cp_size) &&
817        cp->tag_at(signature_index).is_utf8(),
818      "Invalid constant pool index %u for field signature in class file %s",
819      signature_index, CHECK_(nullHandle));
820    symbolHandle sig(THREAD, cp->symbol_at(signature_index));
821    verify_legal_field_signature(name, sig, CHECK_(nullHandle));
822
823    u2 constantvalue_index = 0;
824    bool is_synthetic = false;
825    u2 generic_signature_index = 0;
826    bool is_static = access_flags.is_static();
827
828    u2 attributes_count = cfs->get_u2_fast();
829    if (attributes_count > 0) {
830      parse_field_attributes(cp, attributes_count, is_static, signature_index,
831                             &constantvalue_index, &is_synthetic,
832                             &generic_signature_index, &field_annotations,
833                             CHECK_(nullHandle));
834      if (field_annotations.not_null()) {
835        if (fields_annotations->is_null()) {
836          objArrayOop md = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
837          *fields_annotations = objArrayHandle(THREAD, md);
838        }
839        (*fields_annotations)->obj_at_put(n, field_annotations());
840      }
841      if (is_synthetic) {
842        access_flags.set_is_synthetic();
843      }
844    }
845
846    fields->short_at_put(index++, access_flags.as_short());
847    fields->short_at_put(index++, name_index);
848    fields->short_at_put(index++, signature_index);
849    fields->short_at_put(index++, constantvalue_index);
850
851    // Remember how many oops we encountered and compute allocation type
852    BasicType type = cp->basic_type_for_signature_at(signature_index);
853    FieldAllocationType atype;
854    if ( is_static ) {
855      switch ( type ) {
856        case  T_BOOLEAN:
857        case  T_BYTE:
858          fac->static_byte_count++;
859          atype = STATIC_BYTE;
860          break;
861        case  T_LONG:
862        case  T_DOUBLE:
863          if (Universe::field_type_should_be_aligned(type)) {
864            atype = STATIC_ALIGNED_DOUBLE;
865          } else {
866            atype = STATIC_DOUBLE;
867          }
868          fac->static_double_count++;
869          break;
870        case  T_CHAR:
871        case  T_SHORT:
872          fac->static_short_count++;
873          atype = STATIC_SHORT;
874          break;
875        case  T_FLOAT:
876        case  T_INT:
877          fac->static_word_count++;
878          atype = STATIC_WORD;
879          break;
880        case  T_ARRAY:
881        case  T_OBJECT:
882          fac->static_oop_count++;
883          atype = STATIC_OOP;
884          break;
885        case  T_ADDRESS:
886        case  T_VOID:
887        default:
888          assert(0, "bad field type");
889      }
890    } else {
891      switch ( type ) {
892        case  T_BOOLEAN:
893        case  T_BYTE:
894          fac->nonstatic_byte_count++;
895          atype = NONSTATIC_BYTE;
896          break;
897        case  T_LONG:
898        case  T_DOUBLE:
899          if (Universe::field_type_should_be_aligned(type)) {
900            atype = NONSTATIC_ALIGNED_DOUBLE;
901          } else {
902            atype = NONSTATIC_DOUBLE;
903          }
904          fac->nonstatic_double_count++;
905          break;
906        case  T_CHAR:
907        case  T_SHORT:
908          fac->nonstatic_short_count++;
909          atype = NONSTATIC_SHORT;
910          break;
911        case  T_FLOAT:
912        case  T_INT:
913          fac->nonstatic_word_count++;
914          atype = NONSTATIC_WORD;
915          break;
916        case  T_ARRAY:
917        case  T_OBJECT:
918          fac->nonstatic_oop_count++;
919          atype = NONSTATIC_OOP;
920          break;
921        case  T_ADDRESS:
922        case  T_VOID:
923        default:
924          assert(0, "bad field type");
925      }
926    }
927
928    // The correct offset is computed later (all oop fields will be located together)
929    // We temporarily store the allocation type in the offset field
930    fields->short_at_put(index++, atype);
931    fields->short_at_put(index++, 0);  // Clear out high word of byte offset
932    fields->short_at_put(index++, generic_signature_index);
933  }
934
935  if (_need_verify && length > 1) {
936    // Check duplicated fields
937    ResourceMark rm(THREAD);
938    NameSigHash** names_and_sigs = NEW_RESOURCE_ARRAY_IN_THREAD(
939      THREAD, NameSigHash*, HASH_ROW_SIZE);
940    initialize_hashtable(names_and_sigs);
941    bool dup = false;
942    {
943      debug_only(No_Safepoint_Verifier nsv;)
944      for (int i = 0; i < length*instanceKlass::next_offset; i += instanceKlass::next_offset) {
945        int name_index = fields->ushort_at(i + instanceKlass::name_index_offset);
946        symbolOop name = cp->symbol_at(name_index);
947        int sig_index = fields->ushort_at(i + instanceKlass::signature_index_offset);
948        symbolOop sig = cp->symbol_at(sig_index);
949        // If no duplicates, add name/signature in hashtable names_and_sigs.
950        if (!put_after_lookup(name, sig, names_and_sigs)) {
951          dup = true;
952          break;
953        }
954      }
955    }
956    if (dup) {
957      classfile_parse_error("Duplicate field name&signature in class file %s",
958                            CHECK_(nullHandle));
959    }
960  }
961
962  return fields;
963}
964
965
966static void copy_u2_with_conversion(u2* dest, u2* src, int length) {
967  while (length-- > 0) {
968    *dest++ = Bytes::get_Java_u2((u1*) (src++));
969  }
970}
971
972
973typeArrayHandle ClassFileParser::parse_exception_table(u4 code_length,
974                                                       u4 exception_table_length,
975                                                       constantPoolHandle cp,
976                                                       TRAPS) {
977  ClassFileStream* cfs = stream();
978  typeArrayHandle nullHandle;
979
980  // 4-tuples of ints [start_pc, end_pc, handler_pc, catch_type index]
981  typeArrayOop eh = oopFactory::new_permanent_intArray(exception_table_length*4, CHECK_(nullHandle));
982  typeArrayHandle exception_handlers = typeArrayHandle(THREAD, eh);
983
984  int index = 0;
985  cfs->guarantee_more(8 * exception_table_length, CHECK_(nullHandle)); // start_pc, end_pc, handler_pc, catch_type_index
986  for (unsigned int i = 0; i < exception_table_length; i++) {
987    u2 start_pc = cfs->get_u2_fast();
988    u2 end_pc = cfs->get_u2_fast();
989    u2 handler_pc = cfs->get_u2_fast();
990    u2 catch_type_index = cfs->get_u2_fast();
991    // Will check legal target after parsing code array in verifier.
992    if (_need_verify) {
993      guarantee_property((start_pc < end_pc) && (end_pc <= code_length),
994                         "Illegal exception table range in class file %s", CHECK_(nullHandle));
995      guarantee_property(handler_pc < code_length,
996                         "Illegal exception table handler in class file %s", CHECK_(nullHandle));
997      if (catch_type_index != 0) {
998        guarantee_property(valid_cp_range(catch_type_index, cp->length()) &&
999                           is_klass_reference(cp, catch_type_index),
1000                           "Catch type in exception table has bad constant type in class file %s", CHECK_(nullHandle));
1001      }
1002    }
1003    exception_handlers->int_at_put(index++, start_pc);
1004    exception_handlers->int_at_put(index++, end_pc);
1005    exception_handlers->int_at_put(index++, handler_pc);
1006    exception_handlers->int_at_put(index++, catch_type_index);
1007  }
1008  return exception_handlers;
1009}
1010
1011void ClassFileParser::parse_linenumber_table(
1012    u4 code_attribute_length, u4 code_length,
1013    CompressedLineNumberWriteStream** write_stream, TRAPS) {
1014  ClassFileStream* cfs = stream();
1015  unsigned int num_entries = cfs->get_u2(CHECK);
1016
1017  // Each entry is a u2 start_pc, and a u2 line_number
1018  unsigned int length_in_bytes = num_entries * (sizeof(u2) + sizeof(u2));
1019
1020  // Verify line number attribute and table length
1021  check_property(
1022    code_attribute_length == sizeof(u2) + length_in_bytes,
1023    "LineNumberTable attribute has wrong length in class file %s", CHECK);
1024
1025  cfs->guarantee_more(length_in_bytes, CHECK);
1026
1027  if ((*write_stream) == NULL) {
1028    if (length_in_bytes > fixed_buffer_size) {
1029      (*write_stream) = new CompressedLineNumberWriteStream(length_in_bytes);
1030    } else {
1031      (*write_stream) = new CompressedLineNumberWriteStream(
1032        linenumbertable_buffer, fixed_buffer_size);
1033    }
1034  }
1035
1036  while (num_entries-- > 0) {
1037    u2 bci  = cfs->get_u2_fast(); // start_pc
1038    u2 line = cfs->get_u2_fast(); // line_number
1039    guarantee_property(bci < code_length,
1040        "Invalid pc in LineNumberTable in class file %s", CHECK);
1041    (*write_stream)->write_pair(bci, line);
1042  }
1043}
1044
1045
1046// Class file LocalVariableTable elements.
1047class Classfile_LVT_Element VALUE_OBJ_CLASS_SPEC {
1048 public:
1049  u2 start_bci;
1050  u2 length;
1051  u2 name_cp_index;
1052  u2 descriptor_cp_index;
1053  u2 slot;
1054};
1055
1056
1057class LVT_Hash: public CHeapObj {
1058 public:
1059  LocalVariableTableElement  *_elem;  // element
1060  LVT_Hash*                   _next;  // Next entry in hash table
1061};
1062
1063unsigned int hash(LocalVariableTableElement *elem) {
1064  unsigned int raw_hash = elem->start_bci;
1065
1066  raw_hash = elem->length        + raw_hash * 37;
1067  raw_hash = elem->name_cp_index + raw_hash * 37;
1068  raw_hash = elem->slot          + raw_hash * 37;
1069
1070  return raw_hash % HASH_ROW_SIZE;
1071}
1072
1073void initialize_hashtable(LVT_Hash** table) {
1074  for (int i = 0; i < HASH_ROW_SIZE; i++) {
1075    table[i] = NULL;
1076  }
1077}
1078
1079void clear_hashtable(LVT_Hash** table) {
1080  for (int i = 0; i < HASH_ROW_SIZE; i++) {
1081    LVT_Hash* current = table[i];
1082    LVT_Hash* next;
1083    while (current != NULL) {
1084      next = current->_next;
1085      current->_next = NULL;
1086      delete(current);
1087      current = next;
1088    }
1089    table[i] = NULL;
1090  }
1091}
1092
1093LVT_Hash* LVT_lookup(LocalVariableTableElement *elem, int index, LVT_Hash** table) {
1094  LVT_Hash* entry = table[index];
1095
1096  /*
1097   * 3-tuple start_bci/length/slot has to be unique key,
1098   * so the following comparison seems to be redundant:
1099   *       && elem->name_cp_index == entry->_elem->name_cp_index
1100   */
1101  while (entry != NULL) {
1102    if (elem->start_bci           == entry->_elem->start_bci
1103     && elem->length              == entry->_elem->length
1104     && elem->name_cp_index       == entry->_elem->name_cp_index
1105     && elem->slot                == entry->_elem->slot
1106    ) {
1107      return entry;
1108    }
1109    entry = entry->_next;
1110  }
1111  return NULL;
1112}
1113
1114// Return false if the local variable is found in table.
1115// Return true if no duplicate is found.
1116// And local variable is added as a new entry in table.
1117bool LVT_put_after_lookup(LocalVariableTableElement *elem, LVT_Hash** table) {
1118  // First lookup for duplicates
1119  int index = hash(elem);
1120  LVT_Hash* entry = LVT_lookup(elem, index, table);
1121
1122  if (entry != NULL) {
1123      return false;
1124  }
1125  // No duplicate is found, allocate a new entry and fill it.
1126  if ((entry = new LVT_Hash()) == NULL) {
1127    return false;
1128  }
1129  entry->_elem = elem;
1130
1131  // Insert into hash table
1132  entry->_next = table[index];
1133  table[index] = entry;
1134
1135  return true;
1136}
1137
1138void copy_lvt_element(Classfile_LVT_Element *src, LocalVariableTableElement *lvt) {
1139  lvt->start_bci           = Bytes::get_Java_u2((u1*) &src->start_bci);
1140  lvt->length              = Bytes::get_Java_u2((u1*) &src->length);
1141  lvt->name_cp_index       = Bytes::get_Java_u2((u1*) &src->name_cp_index);
1142  lvt->descriptor_cp_index = Bytes::get_Java_u2((u1*) &src->descriptor_cp_index);
1143  lvt->signature_cp_index  = 0;
1144  lvt->slot                = Bytes::get_Java_u2((u1*) &src->slot);
1145}
1146
1147// Function is used to parse both attributes:
1148//       LocalVariableTable (LVT) and LocalVariableTypeTable (LVTT)
1149u2* ClassFileParser::parse_localvariable_table(u4 code_length,
1150                                               u2 max_locals,
1151                                               u4 code_attribute_length,
1152                                               constantPoolHandle cp,
1153                                               u2* localvariable_table_length,
1154                                               bool isLVTT,
1155                                               TRAPS) {
1156  ClassFileStream* cfs = stream();
1157  const char * tbl_name = (isLVTT) ? "LocalVariableTypeTable" : "LocalVariableTable";
1158  *localvariable_table_length = cfs->get_u2(CHECK_NULL);
1159  unsigned int size = (*localvariable_table_length) * sizeof(Classfile_LVT_Element) / sizeof(u2);
1160  // Verify local variable table attribute has right length
1161  if (_need_verify) {
1162    guarantee_property(code_attribute_length == (sizeof(*localvariable_table_length) + size * sizeof(u2)),
1163                       "%s has wrong length in class file %s", tbl_name, CHECK_NULL);
1164  }
1165  u2* localvariable_table_start = cfs->get_u2_buffer();
1166  assert(localvariable_table_start != NULL, "null local variable table");
1167  if (!_need_verify) {
1168    cfs->skip_u2_fast(size);
1169  } else {
1170    cfs->guarantee_more(size * 2, CHECK_NULL);
1171    for(int i = 0; i < (*localvariable_table_length); i++) {
1172      u2 start_pc = cfs->get_u2_fast();
1173      u2 length = cfs->get_u2_fast();
1174      u2 name_index = cfs->get_u2_fast();
1175      u2 descriptor_index = cfs->get_u2_fast();
1176      u2 index = cfs->get_u2_fast();
1177      // Assign to a u4 to avoid overflow
1178      u4 end_pc = (u4)start_pc + (u4)length;
1179
1180      if (start_pc >= code_length) {
1181        classfile_parse_error(
1182          "Invalid start_pc %u in %s in class file %s",
1183          start_pc, tbl_name, CHECK_NULL);
1184      }
1185      if (end_pc > code_length) {
1186        classfile_parse_error(
1187          "Invalid length %u in %s in class file %s",
1188          length, tbl_name, CHECK_NULL);
1189      }
1190      int cp_size = cp->length();
1191      guarantee_property(
1192        valid_cp_range(name_index, cp_size) &&
1193          cp->tag_at(name_index).is_utf8(),
1194        "Name index %u in %s has bad constant type in class file %s",
1195        name_index, tbl_name, CHECK_NULL);
1196      guarantee_property(
1197        valid_cp_range(descriptor_index, cp_size) &&
1198          cp->tag_at(descriptor_index).is_utf8(),
1199        "Signature index %u in %s has bad constant type in class file %s",
1200        descriptor_index, tbl_name, CHECK_NULL);
1201
1202      symbolHandle name(THREAD, cp->symbol_at(name_index));
1203      symbolHandle sig(THREAD, cp->symbol_at(descriptor_index));
1204      verify_legal_field_name(name, CHECK_NULL);
1205      u2 extra_slot = 0;
1206      if (!isLVTT) {
1207        verify_legal_field_signature(name, sig, CHECK_NULL);
1208
1209        // 4894874: check special cases for double and long local variables
1210        if (sig() == vmSymbols::type_signature(T_DOUBLE) ||
1211            sig() == vmSymbols::type_signature(T_LONG)) {
1212          extra_slot = 1;
1213        }
1214      }
1215      guarantee_property((index + extra_slot) < max_locals,
1216                          "Invalid index %u in %s in class file %s",
1217                          index, tbl_name, CHECK_NULL);
1218    }
1219  }
1220  return localvariable_table_start;
1221}
1222
1223
1224void ClassFileParser::parse_type_array(u2 array_length, u4 code_length, u4* u1_index, u4* u2_index,
1225                                      u1* u1_array, u2* u2_array, constantPoolHandle cp, TRAPS) {
1226  ClassFileStream* cfs = stream();
1227  u2 index = 0; // index in the array with long/double occupying two slots
1228  u4 i1 = *u1_index;
1229  u4 i2 = *u2_index + 1;
1230  for(int i = 0; i < array_length; i++) {
1231    u1 tag = u1_array[i1++] = cfs->get_u1(CHECK);
1232    index++;
1233    if (tag == ITEM_Long || tag == ITEM_Double) {
1234      index++;
1235    } else if (tag == ITEM_Object) {
1236      u2 class_index = u2_array[i2++] = cfs->get_u2(CHECK);
1237      guarantee_property(valid_cp_range(class_index, cp->length()) &&
1238                         is_klass_reference(cp, class_index),
1239                         "Bad class index %u in StackMap in class file %s",
1240                         class_index, CHECK);
1241    } else if (tag == ITEM_Uninitialized) {
1242      u2 offset = u2_array[i2++] = cfs->get_u2(CHECK);
1243      guarantee_property(
1244        offset < code_length,
1245        "Bad uninitialized type offset %u in StackMap in class file %s",
1246        offset, CHECK);
1247    } else {
1248      guarantee_property(
1249        tag <= (u1)ITEM_Uninitialized,
1250        "Unknown variable type %u in StackMap in class file %s",
1251        tag, CHECK);
1252    }
1253  }
1254  u2_array[*u2_index] = index;
1255  *u1_index = i1;
1256  *u2_index = i2;
1257}
1258
1259typeArrayOop ClassFileParser::parse_stackmap_table(
1260    u4 code_attribute_length, TRAPS) {
1261  if (code_attribute_length == 0)
1262    return NULL;
1263
1264  ClassFileStream* cfs = stream();
1265  u1* stackmap_table_start = cfs->get_u1_buffer();
1266  assert(stackmap_table_start != NULL, "null stackmap table");
1267
1268  // check code_attribute_length first
1269  stream()->skip_u1(code_attribute_length, CHECK_NULL);
1270
1271  if (!_need_verify && !DumpSharedSpaces) {
1272    return NULL;
1273  }
1274
1275  typeArrayOop stackmap_data =
1276    oopFactory::new_permanent_byteArray(code_attribute_length, CHECK_NULL);
1277
1278  stackmap_data->set_length(code_attribute_length);
1279  memcpy((void*)stackmap_data->byte_at_addr(0),
1280         (void*)stackmap_table_start, code_attribute_length);
1281  return stackmap_data;
1282}
1283
1284u2* ClassFileParser::parse_checked_exceptions(u2* checked_exceptions_length,
1285                                              u4 method_attribute_length,
1286                                              constantPoolHandle cp, TRAPS) {
1287  ClassFileStream* cfs = stream();
1288  cfs->guarantee_more(2, CHECK_NULL);  // checked_exceptions_length
1289  *checked_exceptions_length = cfs->get_u2_fast();
1290  unsigned int size = (*checked_exceptions_length) * sizeof(CheckedExceptionElement) / sizeof(u2);
1291  u2* checked_exceptions_start = cfs->get_u2_buffer();
1292  assert(checked_exceptions_start != NULL, "null checked exceptions");
1293  if (!_need_verify) {
1294    cfs->skip_u2_fast(size);
1295  } else {
1296    // Verify each value in the checked exception table
1297    u2 checked_exception;
1298    u2 len = *checked_exceptions_length;
1299    cfs->guarantee_more(2 * len, CHECK_NULL);
1300    for (int i = 0; i < len; i++) {
1301      checked_exception = cfs->get_u2_fast();
1302      check_property(
1303        valid_cp_range(checked_exception, cp->length()) &&
1304        is_klass_reference(cp, checked_exception),
1305        "Exception name has bad type at constant pool %u in class file %s",
1306        checked_exception, CHECK_NULL);
1307    }
1308  }
1309  // check exceptions attribute length
1310  if (_need_verify) {
1311    guarantee_property(method_attribute_length == (sizeof(*checked_exceptions_length) +
1312                                                   sizeof(u2) * size),
1313                      "Exceptions attribute has wrong length in class file %s", CHECK_NULL);
1314  }
1315  return checked_exceptions_start;
1316}
1317
1318
1319#define MAX_ARGS_SIZE 255
1320#define MAX_CODE_SIZE 65535
1321#define INITIAL_MAX_LVT_NUMBER 256
1322
1323// Note: the parse_method below is big and clunky because all parsing of the code and exceptions
1324// attribute is inlined. This is curbersome to avoid since we inline most of the parts in the
1325// methodOop to save footprint, so we only know the size of the resulting methodOop when the
1326// entire method attribute is parsed.
1327//
1328// The promoted_flags parameter is used to pass relevant access_flags
1329// from the method back up to the containing klass. These flag values
1330// are added to klass's access_flags.
1331
1332methodHandle ClassFileParser::parse_method(constantPoolHandle cp, bool is_interface,
1333                                           AccessFlags *promoted_flags,
1334                                           typeArrayHandle* method_annotations,
1335                                           typeArrayHandle* method_parameter_annotations,
1336                                           typeArrayHandle* method_default_annotations,
1337                                           TRAPS) {
1338  ClassFileStream* cfs = stream();
1339  methodHandle nullHandle;
1340  ResourceMark rm(THREAD);
1341  // Parse fixed parts
1342  cfs->guarantee_more(8, CHECK_(nullHandle)); // access_flags, name_index, descriptor_index, attributes_count
1343
1344  int flags = cfs->get_u2_fast();
1345  u2 name_index = cfs->get_u2_fast();
1346  int cp_size = cp->length();
1347  check_property(
1348    valid_cp_range(name_index, cp_size) &&
1349      cp->tag_at(name_index).is_utf8(),
1350    "Illegal constant pool index %u for method name in class file %s",
1351    name_index, CHECK_(nullHandle));
1352  symbolHandle name(THREAD, cp->symbol_at(name_index));
1353  verify_legal_method_name(name, CHECK_(nullHandle));
1354
1355  u2 signature_index = cfs->get_u2_fast();
1356  guarantee_property(
1357    valid_cp_range(signature_index, cp_size) &&
1358      cp->tag_at(signature_index).is_utf8(),
1359    "Illegal constant pool index %u for method signature in class file %s",
1360    signature_index, CHECK_(nullHandle));
1361  symbolHandle signature(THREAD, cp->symbol_at(signature_index));
1362
1363  AccessFlags access_flags;
1364  if (name == vmSymbols::class_initializer_name()) {
1365    // We ignore the access flags for a class initializer. (JVM Spec. p. 116)
1366    flags = JVM_ACC_STATIC;
1367  } else {
1368    verify_legal_method_modifiers(flags, is_interface, name, CHECK_(nullHandle));
1369  }
1370
1371  int args_size = -1;  // only used when _need_verify is true
1372  if (_need_verify) {
1373    args_size = ((flags & JVM_ACC_STATIC) ? 0 : 1) +
1374                 verify_legal_method_signature(name, signature, CHECK_(nullHandle));
1375    if (args_size > MAX_ARGS_SIZE) {
1376      classfile_parse_error("Too many arguments in method signature in class file %s", CHECK_(nullHandle));
1377    }
1378  }
1379
1380  access_flags.set_flags(flags & JVM_RECOGNIZED_METHOD_MODIFIERS);
1381
1382  // Default values for code and exceptions attribute elements
1383  u2 max_stack = 0;
1384  u2 max_locals = 0;
1385  u4 code_length = 0;
1386  u1* code_start = 0;
1387  u2 exception_table_length = 0;
1388  typeArrayHandle exception_handlers(THREAD, Universe::the_empty_int_array());
1389  u2 checked_exceptions_length = 0;
1390  u2* checked_exceptions_start = NULL;
1391  CompressedLineNumberWriteStream* linenumber_table = NULL;
1392  int linenumber_table_length = 0;
1393  int total_lvt_length = 0;
1394  u2 lvt_cnt = 0;
1395  u2 lvtt_cnt = 0;
1396  bool lvt_allocated = false;
1397  u2 max_lvt_cnt = INITIAL_MAX_LVT_NUMBER;
1398  u2 max_lvtt_cnt = INITIAL_MAX_LVT_NUMBER;
1399  u2* localvariable_table_length;
1400  u2** localvariable_table_start;
1401  u2* localvariable_type_table_length;
1402  u2** localvariable_type_table_start;
1403  bool parsed_code_attribute = false;
1404  bool parsed_checked_exceptions_attribute = false;
1405  bool parsed_stackmap_attribute = false;
1406  // stackmap attribute - JDK1.5
1407  typeArrayHandle stackmap_data;
1408  u2 generic_signature_index = 0;
1409  u1* runtime_visible_annotations = NULL;
1410  int runtime_visible_annotations_length = 0;
1411  u1* runtime_invisible_annotations = NULL;
1412  int runtime_invisible_annotations_length = 0;
1413  u1* runtime_visible_parameter_annotations = NULL;
1414  int runtime_visible_parameter_annotations_length = 0;
1415  u1* runtime_invisible_parameter_annotations = NULL;
1416  int runtime_invisible_parameter_annotations_length = 0;
1417  u1* annotation_default = NULL;
1418  int annotation_default_length = 0;
1419
1420  // Parse code and exceptions attribute
1421  u2 method_attributes_count = cfs->get_u2_fast();
1422  while (method_attributes_count--) {
1423    cfs->guarantee_more(6, CHECK_(nullHandle));  // method_attribute_name_index, method_attribute_length
1424    u2 method_attribute_name_index = cfs->get_u2_fast();
1425    u4 method_attribute_length = cfs->get_u4_fast();
1426    check_property(
1427      valid_cp_range(method_attribute_name_index, cp_size) &&
1428        cp->tag_at(method_attribute_name_index).is_utf8(),
1429      "Invalid method attribute name index %u in class file %s",
1430      method_attribute_name_index, CHECK_(nullHandle));
1431
1432    symbolOop method_attribute_name = cp->symbol_at(method_attribute_name_index);
1433    if (method_attribute_name == vmSymbols::tag_code()) {
1434      // Parse Code attribute
1435      if (_need_verify) {
1436        guarantee_property(!access_flags.is_native() && !access_flags.is_abstract(),
1437                        "Code attribute in native or abstract methods in class file %s",
1438                         CHECK_(nullHandle));
1439      }
1440      if (parsed_code_attribute) {
1441        classfile_parse_error("Multiple Code attributes in class file %s", CHECK_(nullHandle));
1442      }
1443      parsed_code_attribute = true;
1444
1445      // Stack size, locals size, and code size
1446      if (_major_version == 45 && _minor_version <= 2) {
1447        cfs->guarantee_more(4, CHECK_(nullHandle));
1448        max_stack = cfs->get_u1_fast();
1449        max_locals = cfs->get_u1_fast();
1450        code_length = cfs->get_u2_fast();
1451      } else {
1452        cfs->guarantee_more(8, CHECK_(nullHandle));
1453        max_stack = cfs->get_u2_fast();
1454        max_locals = cfs->get_u2_fast();
1455        code_length = cfs->get_u4_fast();
1456      }
1457      if (_need_verify) {
1458        guarantee_property(args_size <= max_locals,
1459                           "Arguments can't fit into locals in class file %s", CHECK_(nullHandle));
1460        guarantee_property(code_length > 0 && code_length <= MAX_CODE_SIZE,
1461                           "Invalid method Code length %u in class file %s",
1462                           code_length, CHECK_(nullHandle));
1463      }
1464      // Code pointer
1465      code_start = cfs->get_u1_buffer();
1466      assert(code_start != NULL, "null code start");
1467      cfs->guarantee_more(code_length, CHECK_(nullHandle));
1468      cfs->skip_u1_fast(code_length);
1469
1470      // Exception handler table
1471      cfs->guarantee_more(2, CHECK_(nullHandle));  // exception_table_length
1472      exception_table_length = cfs->get_u2_fast();
1473      if (exception_table_length > 0) {
1474        exception_handlers =
1475              parse_exception_table(code_length, exception_table_length, cp, CHECK_(nullHandle));
1476      }
1477
1478      // Parse additional attributes in code attribute
1479      cfs->guarantee_more(2, CHECK_(nullHandle));  // code_attributes_count
1480      u2 code_attributes_count = cfs->get_u2_fast();
1481
1482      unsigned int calculated_attribute_length = 0;
1483
1484      if (_major_version > 45 || (_major_version == 45 && _minor_version > 2)) {
1485        calculated_attribute_length =
1486            sizeof(max_stack) + sizeof(max_locals) + sizeof(code_length);
1487      } else {
1488        // max_stack, locals and length are smaller in pre-version 45.2 classes
1489        calculated_attribute_length = sizeof(u1) + sizeof(u1) + sizeof(u2);
1490      }
1491      calculated_attribute_length +=
1492        code_length +
1493        sizeof(exception_table_length) +
1494        sizeof(code_attributes_count) +
1495        exception_table_length *
1496            ( sizeof(u2) +   // start_pc
1497              sizeof(u2) +   // end_pc
1498              sizeof(u2) +   // handler_pc
1499              sizeof(u2) );  // catch_type_index
1500
1501      while (code_attributes_count--) {
1502        cfs->guarantee_more(6, CHECK_(nullHandle));  // code_attribute_name_index, code_attribute_length
1503        u2 code_attribute_name_index = cfs->get_u2_fast();
1504        u4 code_attribute_length = cfs->get_u4_fast();
1505        calculated_attribute_length += code_attribute_length +
1506                                       sizeof(code_attribute_name_index) +
1507                                       sizeof(code_attribute_length);
1508        check_property(valid_cp_range(code_attribute_name_index, cp_size) &&
1509                       cp->tag_at(code_attribute_name_index).is_utf8(),
1510                       "Invalid code attribute name index %u in class file %s",
1511                       code_attribute_name_index,
1512                       CHECK_(nullHandle));
1513        if (LoadLineNumberTables &&
1514            cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_line_number_table()) {
1515          // Parse and compress line number table
1516          parse_linenumber_table(code_attribute_length, code_length,
1517            &linenumber_table, CHECK_(nullHandle));
1518
1519        } else if (LoadLocalVariableTables &&
1520                   cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_table()) {
1521          // Parse local variable table
1522          if (!lvt_allocated) {
1523            localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD(
1524              THREAD, u2,  INITIAL_MAX_LVT_NUMBER);
1525            localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD(
1526              THREAD, u2*, INITIAL_MAX_LVT_NUMBER);
1527            localvariable_type_table_length = NEW_RESOURCE_ARRAY_IN_THREAD(
1528              THREAD, u2,  INITIAL_MAX_LVT_NUMBER);
1529            localvariable_type_table_start = NEW_RESOURCE_ARRAY_IN_THREAD(
1530              THREAD, u2*, INITIAL_MAX_LVT_NUMBER);
1531            lvt_allocated = true;
1532          }
1533          if (lvt_cnt == max_lvt_cnt) {
1534            max_lvt_cnt <<= 1;
1535            REALLOC_RESOURCE_ARRAY(u2, localvariable_table_length, lvt_cnt, max_lvt_cnt);
1536            REALLOC_RESOURCE_ARRAY(u2*, localvariable_table_start, lvt_cnt, max_lvt_cnt);
1537          }
1538          localvariable_table_start[lvt_cnt] =
1539            parse_localvariable_table(code_length,
1540                                      max_locals,
1541                                      code_attribute_length,
1542                                      cp,
1543                                      &localvariable_table_length[lvt_cnt],
1544                                      false,    // is not LVTT
1545                                      CHECK_(nullHandle));
1546          total_lvt_length += localvariable_table_length[lvt_cnt];
1547          lvt_cnt++;
1548        } else if (LoadLocalVariableTypeTables &&
1549                   _major_version >= JAVA_1_5_VERSION &&
1550                   cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_local_variable_type_table()) {
1551          if (!lvt_allocated) {
1552            localvariable_table_length = NEW_RESOURCE_ARRAY_IN_THREAD(
1553              THREAD, u2,  INITIAL_MAX_LVT_NUMBER);
1554            localvariable_table_start = NEW_RESOURCE_ARRAY_IN_THREAD(
1555              THREAD, u2*, INITIAL_MAX_LVT_NUMBER);
1556            localvariable_type_table_length = NEW_RESOURCE_ARRAY_IN_THREAD(
1557              THREAD, u2,  INITIAL_MAX_LVT_NUMBER);
1558            localvariable_type_table_start = NEW_RESOURCE_ARRAY_IN_THREAD(
1559              THREAD, u2*, INITIAL_MAX_LVT_NUMBER);
1560            lvt_allocated = true;
1561          }
1562          // Parse local variable type table
1563          if (lvtt_cnt == max_lvtt_cnt) {
1564            max_lvtt_cnt <<= 1;
1565            REALLOC_RESOURCE_ARRAY(u2, localvariable_type_table_length, lvtt_cnt, max_lvtt_cnt);
1566            REALLOC_RESOURCE_ARRAY(u2*, localvariable_type_table_start, lvtt_cnt, max_lvtt_cnt);
1567          }
1568          localvariable_type_table_start[lvtt_cnt] =
1569            parse_localvariable_table(code_length,
1570                                      max_locals,
1571                                      code_attribute_length,
1572                                      cp,
1573                                      &localvariable_type_table_length[lvtt_cnt],
1574                                      true,     // is LVTT
1575                                      CHECK_(nullHandle));
1576          lvtt_cnt++;
1577        } else if (UseSplitVerifier &&
1578                   _major_version >= Verifier::STACKMAP_ATTRIBUTE_MAJOR_VERSION &&
1579                   cp->symbol_at(code_attribute_name_index) == vmSymbols::tag_stack_map_table()) {
1580          // Stack map is only needed by the new verifier in JDK1.5.
1581          if (parsed_stackmap_attribute) {
1582            classfile_parse_error("Multiple StackMapTable attributes in class file %s", CHECK_(nullHandle));
1583          }
1584          typeArrayOop sm =
1585            parse_stackmap_table(code_attribute_length, CHECK_(nullHandle));
1586          stackmap_data = typeArrayHandle(THREAD, sm);
1587          parsed_stackmap_attribute = true;
1588        } else {
1589          // Skip unknown attributes
1590          cfs->skip_u1(code_attribute_length, CHECK_(nullHandle));
1591        }
1592      }
1593      // check method attribute length
1594      if (_need_verify) {
1595        guarantee_property(method_attribute_length == calculated_attribute_length,
1596                           "Code segment has wrong length in class file %s", CHECK_(nullHandle));
1597      }
1598    } else if (method_attribute_name == vmSymbols::tag_exceptions()) {
1599      // Parse Exceptions attribute
1600      if (parsed_checked_exceptions_attribute) {
1601        classfile_parse_error("Multiple Exceptions attributes in class file %s", CHECK_(nullHandle));
1602      }
1603      parsed_checked_exceptions_attribute = true;
1604      checked_exceptions_start =
1605            parse_checked_exceptions(&checked_exceptions_length,
1606                                     method_attribute_length,
1607                                     cp, CHECK_(nullHandle));
1608    } else if (method_attribute_name == vmSymbols::tag_synthetic()) {
1609      if (method_attribute_length != 0) {
1610        classfile_parse_error(
1611          "Invalid Synthetic method attribute length %u in class file %s",
1612          method_attribute_length, CHECK_(nullHandle));
1613      }
1614      // Should we check that there hasn't already been a synthetic attribute?
1615      access_flags.set_is_synthetic();
1616    } else if (method_attribute_name == vmSymbols::tag_deprecated()) { // 4276120
1617      if (method_attribute_length != 0) {
1618        classfile_parse_error(
1619          "Invalid Deprecated method attribute length %u in class file %s",
1620          method_attribute_length, CHECK_(nullHandle));
1621      }
1622    } else if (_major_version >= JAVA_1_5_VERSION) {
1623      if (method_attribute_name == vmSymbols::tag_signature()) {
1624        if (method_attribute_length != 2) {
1625          classfile_parse_error(
1626            "Invalid Signature attribute length %u in class file %s",
1627            method_attribute_length, CHECK_(nullHandle));
1628        }
1629        cfs->guarantee_more(2, CHECK_(nullHandle));  // generic_signature_index
1630        generic_signature_index = cfs->get_u2_fast();
1631      } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) {
1632        runtime_visible_annotations_length = method_attribute_length;
1633        runtime_visible_annotations = cfs->get_u1_buffer();
1634        assert(runtime_visible_annotations != NULL, "null visible annotations");
1635        cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle));
1636      } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
1637        runtime_invisible_annotations_length = method_attribute_length;
1638        runtime_invisible_annotations = cfs->get_u1_buffer();
1639        assert(runtime_invisible_annotations != NULL, "null invisible annotations");
1640        cfs->skip_u1(runtime_invisible_annotations_length, CHECK_(nullHandle));
1641      } else if (method_attribute_name == vmSymbols::tag_runtime_visible_parameter_annotations()) {
1642        runtime_visible_parameter_annotations_length = method_attribute_length;
1643        runtime_visible_parameter_annotations = cfs->get_u1_buffer();
1644        assert(runtime_visible_parameter_annotations != NULL, "null visible parameter annotations");
1645        cfs->skip_u1(runtime_visible_parameter_annotations_length, CHECK_(nullHandle));
1646      } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_parameter_annotations()) {
1647        runtime_invisible_parameter_annotations_length = method_attribute_length;
1648        runtime_invisible_parameter_annotations = cfs->get_u1_buffer();
1649        assert(runtime_invisible_parameter_annotations != NULL, "null invisible parameter annotations");
1650        cfs->skip_u1(runtime_invisible_parameter_annotations_length, CHECK_(nullHandle));
1651      } else if (method_attribute_name == vmSymbols::tag_annotation_default()) {
1652        annotation_default_length = method_attribute_length;
1653        annotation_default = cfs->get_u1_buffer();
1654        assert(annotation_default != NULL, "null annotation default");
1655        cfs->skip_u1(annotation_default_length, CHECK_(nullHandle));
1656      } else {
1657        // Skip unknown attributes
1658        cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
1659      }
1660    } else {
1661      // Skip unknown attributes
1662      cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
1663    }
1664  }
1665
1666  if (linenumber_table != NULL) {
1667    linenumber_table->write_terminator();
1668    linenumber_table_length = linenumber_table->position();
1669  }
1670
1671  // Make sure there's at least one Code attribute in non-native/non-abstract method
1672  if (_need_verify) {
1673    guarantee_property(access_flags.is_native() || access_flags.is_abstract() || parsed_code_attribute,
1674                      "Absent Code attribute in method that is not native or abstract in class file %s", CHECK_(nullHandle));
1675  }
1676
1677  // All sizing information for a methodOop is finally available, now create it
1678  methodOop m_oop  = oopFactory::new_method(
1679    code_length, access_flags, linenumber_table_length,
1680    total_lvt_length, checked_exceptions_length,
1681    methodOopDesc::IsSafeConc, CHECK_(nullHandle));
1682  methodHandle m (THREAD, m_oop);
1683
1684  ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize);
1685
1686  // Fill in information from fixed part (access_flags already set)
1687  m->set_constants(cp());
1688  m->set_name_index(name_index);
1689  m->set_signature_index(signature_index);
1690  m->set_generic_signature_index(generic_signature_index);
1691#ifdef CC_INTERP
1692  // hmm is there a gc issue here??
1693  ResultTypeFinder rtf(cp->symbol_at(signature_index));
1694  m->set_result_index(rtf.type());
1695#endif
1696
1697  if (args_size >= 0) {
1698    m->set_size_of_parameters(args_size);
1699  } else {
1700    m->compute_size_of_parameters(THREAD);
1701  }
1702#ifdef ASSERT
1703  if (args_size >= 0) {
1704    m->compute_size_of_parameters(THREAD);
1705    assert(args_size == m->size_of_parameters(), "");
1706  }
1707#endif
1708
1709  // Fill in code attribute information
1710  m->set_max_stack(max_stack);
1711  m->set_max_locals(max_locals);
1712  m->constMethod()->set_stackmap_data(stackmap_data());
1713
1714  /**
1715   * The exception_table field is the flag used to indicate
1716   * that the methodOop and it's associated constMethodOop are partially
1717   * initialized and thus are exempt from pre/post GC verification.  Once
1718   * the field is set, the oops are considered fully initialized so make
1719   * sure that the oops can pass verification when this field is set.
1720   */
1721  m->set_exception_table(exception_handlers());
1722
1723  // Copy byte codes
1724  if (code_length > 0) {
1725    memcpy(m->code_base(), code_start, code_length);
1726  }
1727
1728  // Copy line number table
1729  if (linenumber_table != NULL) {
1730    memcpy(m->compressed_linenumber_table(),
1731           linenumber_table->buffer(), linenumber_table_length);
1732  }
1733
1734  // Copy checked exceptions
1735  if (checked_exceptions_length > 0) {
1736    int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2);
1737    copy_u2_with_conversion((u2*) m->checked_exceptions_start(), checked_exceptions_start, size);
1738  }
1739
1740  /* Copy class file LVT's/LVTT's into the HotSpot internal LVT.
1741   *
1742   * Rules for LVT's and LVTT's are:
1743   *   - There can be any number of LVT's and LVTT's.
1744   *   - If there are n LVT's, it is the same as if there was just
1745   *     one LVT containing all the entries from the n LVT's.
1746   *   - There may be no more than one LVT entry per local variable.
1747   *     Two LVT entries are 'equal' if these fields are the same:
1748   *        start_pc, length, name, slot
1749   *   - There may be no more than one LVTT entry per each LVT entry.
1750   *     Each LVTT entry has to match some LVT entry.
1751   *   - HotSpot internal LVT keeps natural ordering of class file LVT entries.
1752   */
1753  if (total_lvt_length > 0) {
1754    int tbl_no, idx;
1755
1756    promoted_flags->set_has_localvariable_table();
1757
1758    LVT_Hash** lvt_Hash = NEW_RESOURCE_ARRAY(LVT_Hash*, HASH_ROW_SIZE);
1759    initialize_hashtable(lvt_Hash);
1760
1761    // To fill LocalVariableTable in
1762    Classfile_LVT_Element*  cf_lvt;
1763    LocalVariableTableElement* lvt = m->localvariable_table_start();
1764
1765    for (tbl_no = 0; tbl_no < lvt_cnt; tbl_no++) {
1766      cf_lvt = (Classfile_LVT_Element *) localvariable_table_start[tbl_no];
1767      for (idx = 0; idx < localvariable_table_length[tbl_no]; idx++, lvt++) {
1768        copy_lvt_element(&cf_lvt[idx], lvt);
1769        // If no duplicates, add LVT elem in hashtable lvt_Hash.
1770        if (LVT_put_after_lookup(lvt, lvt_Hash) == false
1771          && _need_verify
1772          && _major_version >= JAVA_1_5_VERSION ) {
1773          clear_hashtable(lvt_Hash);
1774          classfile_parse_error("Duplicated LocalVariableTable attribute "
1775                                "entry for '%s' in class file %s",
1776                                 cp->symbol_at(lvt->name_cp_index)->as_utf8(),
1777                                 CHECK_(nullHandle));
1778        }
1779      }
1780    }
1781
1782    // To merge LocalVariableTable and LocalVariableTypeTable
1783    Classfile_LVT_Element* cf_lvtt;
1784    LocalVariableTableElement lvtt_elem;
1785
1786    for (tbl_no = 0; tbl_no < lvtt_cnt; tbl_no++) {
1787      cf_lvtt = (Classfile_LVT_Element *) localvariable_type_table_start[tbl_no];
1788      for (idx = 0; idx < localvariable_type_table_length[tbl_no]; idx++) {
1789        copy_lvt_element(&cf_lvtt[idx], &lvtt_elem);
1790        int index = hash(&lvtt_elem);
1791        LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash);
1792        if (entry == NULL) {
1793          if (_need_verify) {
1794            clear_hashtable(lvt_Hash);
1795            classfile_parse_error("LVTT entry for '%s' in class file %s "
1796                                  "does not match any LVT entry",
1797                                   cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
1798                                   CHECK_(nullHandle));
1799          }
1800        } else if (entry->_elem->signature_cp_index != 0 && _need_verify) {
1801          clear_hashtable(lvt_Hash);
1802          classfile_parse_error("Duplicated LocalVariableTypeTable attribute "
1803                                "entry for '%s' in class file %s",
1804                                 cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
1805                                 CHECK_(nullHandle));
1806        } else {
1807          // to add generic signatures into LocalVariableTable
1808          entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index;
1809        }
1810      }
1811    }
1812    clear_hashtable(lvt_Hash);
1813  }
1814
1815  *method_annotations = assemble_annotations(runtime_visible_annotations,
1816                                             runtime_visible_annotations_length,
1817                                             runtime_invisible_annotations,
1818                                             runtime_invisible_annotations_length,
1819                                             CHECK_(nullHandle));
1820  *method_parameter_annotations = assemble_annotations(runtime_visible_parameter_annotations,
1821                                                       runtime_visible_parameter_annotations_length,
1822                                                       runtime_invisible_parameter_annotations,
1823                                                       runtime_invisible_parameter_annotations_length,
1824                                                       CHECK_(nullHandle));
1825  *method_default_annotations = assemble_annotations(annotation_default,
1826                                                     annotation_default_length,
1827                                                     NULL,
1828                                                     0,
1829                                                     CHECK_(nullHandle));
1830
1831  if (name() == vmSymbols::finalize_method_name() &&
1832      signature() == vmSymbols::void_method_signature()) {
1833    if (m->is_empty_method()) {
1834      _has_empty_finalizer = true;
1835    } else {
1836      _has_finalizer = true;
1837    }
1838  }
1839  if (name() == vmSymbols::object_initializer_name() &&
1840      signature() == vmSymbols::void_method_signature() &&
1841      m->is_vanilla_constructor()) {
1842    _has_vanilla_constructor = true;
1843  }
1844
1845  return m;
1846}
1847
1848
1849// The promoted_flags parameter is used to pass relevant access_flags
1850// from the methods back up to the containing klass. These flag values
1851// are added to klass's access_flags.
1852
1853objArrayHandle ClassFileParser::parse_methods(constantPoolHandle cp, bool is_interface,
1854                                              AccessFlags* promoted_flags,
1855                                              bool* has_final_method,
1856                                              objArrayOop* methods_annotations_oop,
1857                                              objArrayOop* methods_parameter_annotations_oop,
1858                                              objArrayOop* methods_default_annotations_oop,
1859                                              TRAPS) {
1860  ClassFileStream* cfs = stream();
1861  objArrayHandle nullHandle;
1862  typeArrayHandle method_annotations;
1863  typeArrayHandle method_parameter_annotations;
1864  typeArrayHandle method_default_annotations;
1865  cfs->guarantee_more(2, CHECK_(nullHandle));  // length
1866  u2 length = cfs->get_u2_fast();
1867  if (length == 0) {
1868    return objArrayHandle(THREAD, Universe::the_empty_system_obj_array());
1869  } else {
1870    objArrayOop m = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
1871    objArrayHandle methods(THREAD, m);
1872    HandleMark hm(THREAD);
1873    objArrayHandle methods_annotations;
1874    objArrayHandle methods_parameter_annotations;
1875    objArrayHandle methods_default_annotations;
1876    for (int index = 0; index < length; index++) {
1877      methodHandle method = parse_method(cp, is_interface,
1878                                         promoted_flags,
1879                                         &method_annotations,
1880                                         &method_parameter_annotations,
1881                                         &method_default_annotations,
1882                                         CHECK_(nullHandle));
1883      if (method->is_final()) {
1884        *has_final_method = true;
1885      }
1886      methods->obj_at_put(index, method());
1887      if (method_annotations.not_null()) {
1888        if (methods_annotations.is_null()) {
1889          objArrayOop md = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
1890          methods_annotations = objArrayHandle(THREAD, md);
1891        }
1892        methods_annotations->obj_at_put(index, method_annotations());
1893      }
1894      if (method_parameter_annotations.not_null()) {
1895        if (methods_parameter_annotations.is_null()) {
1896          objArrayOop md = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
1897          methods_parameter_annotations = objArrayHandle(THREAD, md);
1898        }
1899        methods_parameter_annotations->obj_at_put(index, method_parameter_annotations());
1900      }
1901      if (method_default_annotations.not_null()) {
1902        if (methods_default_annotations.is_null()) {
1903          objArrayOop md = oopFactory::new_system_objArray(length, CHECK_(nullHandle));
1904          methods_default_annotations = objArrayHandle(THREAD, md);
1905        }
1906        methods_default_annotations->obj_at_put(index, method_default_annotations());
1907      }
1908    }
1909    if (_need_verify && length > 1) {
1910      // Check duplicated methods
1911      ResourceMark rm(THREAD);
1912      NameSigHash** names_and_sigs = NEW_RESOURCE_ARRAY_IN_THREAD(
1913        THREAD, NameSigHash*, HASH_ROW_SIZE);
1914      initialize_hashtable(names_and_sigs);
1915      bool dup = false;
1916      {
1917        debug_only(No_Safepoint_Verifier nsv;)
1918        for (int i = 0; i < length; i++) {
1919          methodOop m = (methodOop)methods->obj_at(i);
1920          // If no duplicates, add name/signature in hashtable names_and_sigs.
1921          if (!put_after_lookup(m->name(), m->signature(), names_and_sigs)) {
1922            dup = true;
1923            break;
1924          }
1925        }
1926      }
1927      if (dup) {
1928        classfile_parse_error("Duplicate method name&signature in class file %s",
1929                              CHECK_(nullHandle));
1930      }
1931    }
1932
1933    *methods_annotations_oop = methods_annotations();
1934    *methods_parameter_annotations_oop = methods_parameter_annotations();
1935    *methods_default_annotations_oop = methods_default_annotations();
1936
1937    return methods;
1938  }
1939}
1940
1941
1942typeArrayHandle ClassFileParser::sort_methods(objArrayHandle methods,
1943                                              objArrayHandle methods_annotations,
1944                                              objArrayHandle methods_parameter_annotations,
1945                                              objArrayHandle methods_default_annotations,
1946                                              TRAPS) {
1947  typeArrayHandle nullHandle;
1948  int length = methods()->length();
1949  // If JVMTI original method ordering is enabled we have to
1950  // remember the original class file ordering.
1951  // We temporarily use the vtable_index field in the methodOop to store the
1952  // class file index, so we can read in after calling qsort.
1953  if (JvmtiExport::can_maintain_original_method_order()) {
1954    for (int index = 0; index < length; index++) {
1955      methodOop m = methodOop(methods->obj_at(index));
1956      assert(!m->valid_vtable_index(), "vtable index should not be set");
1957      m->set_vtable_index(index);
1958    }
1959  }
1960  // Sort method array by ascending method name (for faster lookups & vtable construction)
1961  // Note that the ordering is not alphabetical, see symbolOopDesc::fast_compare
1962  methodOopDesc::sort_methods(methods(),
1963                              methods_annotations(),
1964                              methods_parameter_annotations(),
1965                              methods_default_annotations());
1966
1967  // If JVMTI original method ordering is enabled construct int array remembering the original ordering
1968  if (JvmtiExport::can_maintain_original_method_order()) {
1969    typeArrayOop new_ordering = oopFactory::new_permanent_intArray(length, CHECK_(nullHandle));
1970    typeArrayHandle method_ordering(THREAD, new_ordering);
1971    for (int index = 0; index < length; index++) {
1972      methodOop m = methodOop(methods->obj_at(index));
1973      int old_index = m->vtable_index();
1974      assert(old_index >= 0 && old_index < length, "invalid method index");
1975      method_ordering->int_at_put(index, old_index);
1976      m->set_vtable_index(methodOopDesc::invalid_vtable_index);
1977    }
1978    return method_ordering;
1979  } else {
1980    return typeArrayHandle(THREAD, Universe::the_empty_int_array());
1981  }
1982}
1983
1984
1985void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
1986  ClassFileStream* cfs = stream();
1987  cfs->guarantee_more(2, CHECK);  // sourcefile_index
1988  u2 sourcefile_index = cfs->get_u2_fast();
1989  check_property(
1990    valid_cp_range(sourcefile_index, cp->length()) &&
1991      cp->tag_at(sourcefile_index).is_utf8(),
1992    "Invalid SourceFile attribute at constant pool index %u in class file %s",
1993    sourcefile_index, CHECK);
1994  k->set_source_file_name(cp->symbol_at(sourcefile_index));
1995}
1996
1997
1998
1999void ClassFileParser::parse_classfile_source_debug_extension_attribute(constantPoolHandle cp,
2000                                                                       instanceKlassHandle k,
2001                                                                       int length, TRAPS) {
2002  ClassFileStream* cfs = stream();
2003  u1* sde_buffer = cfs->get_u1_buffer();
2004  assert(sde_buffer != NULL, "null sde buffer");
2005
2006  // Don't bother storing it if there is no way to retrieve it
2007  if (JvmtiExport::can_get_source_debug_extension()) {
2008    // Optimistically assume that only 1 byte UTF format is used
2009    // (common case)
2010    symbolOop sde_symbol = oopFactory::new_symbol((char*)sde_buffer,
2011                                                  length, CHECK);
2012    k->set_source_debug_extension(sde_symbol);
2013  }
2014  // Got utf8 string, set stream position forward
2015  cfs->skip_u1(length, CHECK);
2016}
2017
2018
2019// Inner classes can be static, private or protected (classic VM does this)
2020#define RECOGNIZED_INNER_CLASS_MODIFIERS (JVM_RECOGNIZED_CLASS_MODIFIERS | JVM_ACC_PRIVATE | JVM_ACC_PROTECTED | JVM_ACC_STATIC)
2021
2022// Return number of classes in the inner classes attribute table
2023u2 ClassFileParser::parse_classfile_inner_classes_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
2024  ClassFileStream* cfs = stream();
2025  cfs->guarantee_more(2, CHECK_0);  // length
2026  u2 length = cfs->get_u2_fast();
2027
2028  // 4-tuples of shorts [inner_class_info_index, outer_class_info_index, inner_name_index, inner_class_access_flags]
2029  typeArrayOop ic = oopFactory::new_permanent_shortArray(length*4, CHECK_0);
2030  typeArrayHandle inner_classes(THREAD, ic);
2031  int index = 0;
2032  int cp_size = cp->length();
2033  cfs->guarantee_more(8 * length, CHECK_0);  // 4-tuples of u2
2034  for (int n = 0; n < length; n++) {
2035    // Inner class index
2036    u2 inner_class_info_index = cfs->get_u2_fast();
2037    check_property(
2038      inner_class_info_index == 0 ||
2039        (valid_cp_range(inner_class_info_index, cp_size) &&
2040        is_klass_reference(cp, inner_class_info_index)),
2041      "inner_class_info_index %u has bad constant type in class file %s",
2042      inner_class_info_index, CHECK_0);
2043    // Outer class index
2044    u2 outer_class_info_index = cfs->get_u2_fast();
2045    check_property(
2046      outer_class_info_index == 0 ||
2047        (valid_cp_range(outer_class_info_index, cp_size) &&
2048        is_klass_reference(cp, outer_class_info_index)),
2049      "outer_class_info_index %u has bad constant type in class file %s",
2050      outer_class_info_index, CHECK_0);
2051    // Inner class name
2052    u2 inner_name_index = cfs->get_u2_fast();
2053    check_property(
2054      inner_name_index == 0 || (valid_cp_range(inner_name_index, cp_size) &&
2055        cp->tag_at(inner_name_index).is_utf8()),
2056      "inner_name_index %u has bad constant type in class file %s",
2057      inner_name_index, CHECK_0);
2058    if (_need_verify) {
2059      guarantee_property(inner_class_info_index != outer_class_info_index,
2060                         "Class is both outer and inner class in class file %s", CHECK_0);
2061    }
2062    // Access flags
2063    AccessFlags inner_access_flags;
2064    jint flags = cfs->get_u2_fast() & RECOGNIZED_INNER_CLASS_MODIFIERS;
2065    if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) {
2066      // Set abstract bit for old class files for backward compatibility
2067      flags |= JVM_ACC_ABSTRACT;
2068    }
2069    verify_legal_class_modifiers(flags, CHECK_0);
2070    inner_access_flags.set_flags(flags);
2071
2072    inner_classes->short_at_put(index++, inner_class_info_index);
2073    inner_classes->short_at_put(index++, outer_class_info_index);
2074    inner_classes->short_at_put(index++, inner_name_index);
2075    inner_classes->short_at_put(index++, inner_access_flags.as_short());
2076  }
2077
2078  // 4347400: make sure there's no duplicate entry in the classes array
2079  if (_need_verify && _major_version >= JAVA_1_5_VERSION) {
2080    for(int i = 0; i < inner_classes->length(); i += 4) {
2081      for(int j = i + 4; j < inner_classes->length(); j += 4) {
2082        guarantee_property((inner_classes->ushort_at(i)   != inner_classes->ushort_at(j) ||
2083                            inner_classes->ushort_at(i+1) != inner_classes->ushort_at(j+1) ||
2084                            inner_classes->ushort_at(i+2) != inner_classes->ushort_at(j+2) ||
2085                            inner_classes->ushort_at(i+3) != inner_classes->ushort_at(j+3)),
2086                            "Duplicate entry in InnerClasses in class file %s",
2087                            CHECK_0);
2088      }
2089    }
2090  }
2091
2092  // Update instanceKlass with inner class info.
2093  k->set_inner_classes(inner_classes());
2094  return length;
2095}
2096
2097void ClassFileParser::parse_classfile_synthetic_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
2098  k->set_is_synthetic();
2099}
2100
2101void ClassFileParser::parse_classfile_signature_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
2102  ClassFileStream* cfs = stream();
2103  u2 signature_index = cfs->get_u2(CHECK);
2104  check_property(
2105    valid_cp_range(signature_index, cp->length()) &&
2106      cp->tag_at(signature_index).is_utf8(),
2107    "Invalid constant pool index %u in Signature attribute in class file %s",
2108    signature_index, CHECK);
2109  k->set_generic_signature(cp->symbol_at(signature_index));
2110}
2111
2112void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp, instanceKlassHandle k, TRAPS) {
2113  ClassFileStream* cfs = stream();
2114  // Set inner classes attribute to default sentinel
2115  k->set_inner_classes(Universe::the_empty_short_array());
2116  cfs->guarantee_more(2, CHECK);  // attributes_count
2117  u2 attributes_count = cfs->get_u2_fast();
2118  bool parsed_sourcefile_attribute = false;
2119  bool parsed_innerclasses_attribute = false;
2120  bool parsed_enclosingmethod_attribute = false;
2121  u1* runtime_visible_annotations = NULL;
2122  int runtime_visible_annotations_length = 0;
2123  u1* runtime_invisible_annotations = NULL;
2124  int runtime_invisible_annotations_length = 0;
2125  // Iterate over attributes
2126  while (attributes_count--) {
2127    cfs->guarantee_more(6, CHECK);  // attribute_name_index, attribute_length
2128    u2 attribute_name_index = cfs->get_u2_fast();
2129    u4 attribute_length = cfs->get_u4_fast();
2130    check_property(
2131      valid_cp_range(attribute_name_index, cp->length()) &&
2132        cp->tag_at(attribute_name_index).is_utf8(),
2133      "Attribute name has bad constant pool index %u in class file %s",
2134      attribute_name_index, CHECK);
2135    symbolOop tag = cp->symbol_at(attribute_name_index);
2136    if (tag == vmSymbols::tag_source_file()) {
2137      // Check for SourceFile tag
2138      if (_need_verify) {
2139        guarantee_property(attribute_length == 2, "Wrong SourceFile attribute length in class file %s", CHECK);
2140      }
2141      if (parsed_sourcefile_attribute) {
2142        classfile_parse_error("Multiple SourceFile attributes in class file %s", CHECK);
2143      } else {
2144        parsed_sourcefile_attribute = true;
2145      }
2146      parse_classfile_sourcefile_attribute(cp, k, CHECK);
2147    } else if (tag == vmSymbols::tag_source_debug_extension()) {
2148      // Check for SourceDebugExtension tag
2149      parse_classfile_source_debug_extension_attribute(cp, k, (int)attribute_length, CHECK);
2150    } else if (tag == vmSymbols::tag_inner_classes()) {
2151      // Check for InnerClasses tag
2152      if (parsed_innerclasses_attribute) {
2153        classfile_parse_error("Multiple InnerClasses attributes in class file %s", CHECK);
2154      } else {
2155        parsed_innerclasses_attribute = true;
2156      }
2157      u2 num_of_classes = parse_classfile_inner_classes_attribute(cp, k, CHECK);
2158      if (_need_verify && _major_version >= JAVA_1_5_VERSION) {
2159        guarantee_property(attribute_length == sizeof(num_of_classes) + 4 * sizeof(u2) * num_of_classes,
2160                          "Wrong InnerClasses attribute length in class file %s", CHECK);
2161      }
2162    } else if (tag == vmSymbols::tag_synthetic()) {
2163      // Check for Synthetic tag
2164      // Shouldn't we check that the synthetic flags wasn't already set? - not required in spec
2165      if (attribute_length != 0) {
2166        classfile_parse_error(
2167          "Invalid Synthetic classfile attribute length %u in class file %s",
2168          attribute_length, CHECK);
2169      }
2170      parse_classfile_synthetic_attribute(cp, k, CHECK);
2171    } else if (tag == vmSymbols::tag_deprecated()) {
2172      // Check for Deprecatd tag - 4276120
2173      if (attribute_length != 0) {
2174        classfile_parse_error(
2175          "Invalid Deprecated classfile attribute length %u in class file %s",
2176          attribute_length, CHECK);
2177      }
2178    } else if (_major_version >= JAVA_1_5_VERSION) {
2179      if (tag == vmSymbols::tag_signature()) {
2180        if (attribute_length != 2) {
2181          classfile_parse_error(
2182            "Wrong Signature attribute length %u in class file %s",
2183            attribute_length, CHECK);
2184        }
2185        parse_classfile_signature_attribute(cp, k, CHECK);
2186      } else if (tag == vmSymbols::tag_runtime_visible_annotations()) {
2187        runtime_visible_annotations_length = attribute_length;
2188        runtime_visible_annotations = cfs->get_u1_buffer();
2189        assert(runtime_visible_annotations != NULL, "null visible annotations");
2190        cfs->skip_u1(runtime_visible_annotations_length, CHECK);
2191      } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_annotations()) {
2192        runtime_invisible_annotations_length = attribute_length;
2193        runtime_invisible_annotations = cfs->get_u1_buffer();
2194        assert(runtime_invisible_annotations != NULL, "null invisible annotations");
2195        cfs->skip_u1(runtime_invisible_annotations_length, CHECK);
2196      } else if (tag == vmSymbols::tag_enclosing_method()) {
2197        if (parsed_enclosingmethod_attribute) {
2198          classfile_parse_error("Multiple EnclosingMethod attributes in class file %s", CHECK);
2199        }   else {
2200          parsed_enclosingmethod_attribute = true;
2201        }
2202        cfs->guarantee_more(4, CHECK);  // class_index, method_index
2203        u2 class_index  = cfs->get_u2_fast();
2204        u2 method_index = cfs->get_u2_fast();
2205        if (class_index == 0) {
2206          classfile_parse_error("Invalid class index in EnclosingMethod attribute in class file %s", CHECK);
2207        }
2208        // Validate the constant pool indices and types
2209        if (!cp->is_within_bounds(class_index) ||
2210            !is_klass_reference(cp, class_index)) {
2211          classfile_parse_error("Invalid or out-of-bounds class index in EnclosingMethod attribute in class file %s", CHECK);
2212        }
2213        if (method_index != 0 &&
2214            (!cp->is_within_bounds(method_index) ||
2215             !cp->tag_at(method_index).is_name_and_type())) {
2216          classfile_parse_error("Invalid or out-of-bounds method index in EnclosingMethod attribute in class file %s", CHECK);
2217        }
2218        k->set_enclosing_method_indices(class_index, method_index);
2219      } else {
2220        // Unknown attribute
2221        cfs->skip_u1(attribute_length, CHECK);
2222      }
2223    } else {
2224      // Unknown attribute
2225      cfs->skip_u1(attribute_length, CHECK);
2226    }
2227  }
2228  typeArrayHandle annotations = assemble_annotations(runtime_visible_annotations,
2229                                                     runtime_visible_annotations_length,
2230                                                     runtime_invisible_annotations,
2231                                                     runtime_invisible_annotations_length,
2232                                                     CHECK);
2233  k->set_class_annotations(annotations());
2234}
2235
2236
2237typeArrayHandle ClassFileParser::assemble_annotations(u1* runtime_visible_annotations,
2238                                                      int runtime_visible_annotations_length,
2239                                                      u1* runtime_invisible_annotations,
2240                                                      int runtime_invisible_annotations_length, TRAPS) {
2241  typeArrayHandle annotations;
2242  if (runtime_visible_annotations != NULL ||
2243      runtime_invisible_annotations != NULL) {
2244    typeArrayOop anno = oopFactory::new_permanent_byteArray(runtime_visible_annotations_length +
2245                                                            runtime_invisible_annotations_length, CHECK_(annotations));
2246    annotations = typeArrayHandle(THREAD, anno);
2247    if (runtime_visible_annotations != NULL) {
2248      memcpy(annotations->byte_at_addr(0), runtime_visible_annotations, runtime_visible_annotations_length);
2249    }
2250    if (runtime_invisible_annotations != NULL) {
2251      memcpy(annotations->byte_at_addr(runtime_visible_annotations_length), runtime_invisible_annotations, runtime_invisible_annotations_length);
2252    }
2253  }
2254  return annotations;
2255}
2256
2257
2258static void initialize_static_field(fieldDescriptor* fd, TRAPS) {
2259  KlassHandle h_k (THREAD, fd->field_holder());
2260  assert(h_k.not_null() && fd->is_static(), "just checking");
2261  if (fd->has_initial_value()) {
2262    BasicType t = fd->field_type();
2263    switch (t) {
2264      case T_BYTE:
2265        h_k()->byte_field_put(fd->offset(), fd->int_initial_value());
2266              break;
2267      case T_BOOLEAN:
2268        h_k()->bool_field_put(fd->offset(), fd->int_initial_value());
2269              break;
2270      case T_CHAR:
2271        h_k()->char_field_put(fd->offset(), fd->int_initial_value());
2272              break;
2273      case T_SHORT:
2274        h_k()->short_field_put(fd->offset(), fd->int_initial_value());
2275              break;
2276      case T_INT:
2277        h_k()->int_field_put(fd->offset(), fd->int_initial_value());
2278        break;
2279      case T_FLOAT:
2280        h_k()->float_field_put(fd->offset(), fd->float_initial_value());
2281        break;
2282      case T_DOUBLE:
2283        h_k()->double_field_put(fd->offset(), fd->double_initial_value());
2284        break;
2285      case T_LONG:
2286        h_k()->long_field_put(fd->offset(), fd->long_initial_value());
2287        break;
2288      case T_OBJECT:
2289        {
2290          #ifdef ASSERT
2291          symbolOop sym = oopFactory::new_symbol("Ljava/lang/String;", CHECK);
2292          assert(fd->signature() == sym, "just checking");
2293          #endif
2294          oop string = fd->string_initial_value(CHECK);
2295          h_k()->obj_field_put(fd->offset(), string);
2296        }
2297        break;
2298      default:
2299        THROW_MSG(vmSymbols::java_lang_ClassFormatError(),
2300                  "Illegal ConstantValue attribute in class file");
2301    }
2302  }
2303}
2304
2305
2306void ClassFileParser::java_lang_ref_Reference_fix_pre(typeArrayHandle* fields_ptr,
2307  constantPoolHandle cp, FieldAllocationCount *fac_ptr, TRAPS) {
2308  // This code is for compatibility with earlier jdk's that do not
2309  // have the "discovered" field in java.lang.ref.Reference.  For 1.5
2310  // the check for the "discovered" field should issue a warning if
2311  // the field is not found.  For 1.6 this code should be issue a
2312  // fatal error if the "discovered" field is not found.
2313  //
2314  // Increment fac.nonstatic_oop_count so that the start of the
2315  // next type of non-static oops leaves room for the fake oop.
2316  // Do not increment next_nonstatic_oop_offset so that the
2317  // fake oop is place after the java.lang.ref.Reference oop
2318  // fields.
2319  //
2320  // Check the fields in java.lang.ref.Reference for the "discovered"
2321  // field.  If it is not present, artifically create a field for it.
2322  // This allows this VM to run on early JDK where the field is not
2323  // present.
2324
2325  //
2326  // Increment fac.nonstatic_oop_count so that the start of the
2327  // next type of non-static oops leaves room for the fake oop.
2328  // Do not increment next_nonstatic_oop_offset so that the
2329  // fake oop is place after the java.lang.ref.Reference oop
2330  // fields.
2331  //
2332  // Check the fields in java.lang.ref.Reference for the "discovered"
2333  // field.  If it is not present, artifically create a field for it.
2334  // This allows this VM to run on early JDK where the field is not
2335  // present.
2336  int reference_sig_index = 0;
2337  int reference_name_index = 0;
2338  int reference_index = 0;
2339  int extra = java_lang_ref_Reference::number_of_fake_oop_fields;
2340  const int n = (*fields_ptr)()->length();
2341  for (int i = 0; i < n; i += instanceKlass::next_offset ) {
2342    int name_index =
2343    (*fields_ptr)()->ushort_at(i + instanceKlass::name_index_offset);
2344    int sig_index  =
2345      (*fields_ptr)()->ushort_at(i + instanceKlass::signature_index_offset);
2346    symbolOop f_name = cp->symbol_at(name_index);
2347    symbolOop f_sig  = cp->symbol_at(sig_index);
2348    if (f_sig == vmSymbols::reference_signature() && reference_index == 0) {
2349      // Save the index for reference signature for later use.
2350      // The fake discovered field does not entries in the
2351      // constant pool so the index for its signature cannot
2352      // be extracted from the constant pool.  It will need
2353      // later, however.  It's signature is vmSymbols::reference_signature()
2354      // so same an index for that signature.
2355      reference_sig_index = sig_index;
2356      reference_name_index = name_index;
2357      reference_index = i;
2358    }
2359    if (f_name == vmSymbols::reference_discovered_name() &&
2360      f_sig == vmSymbols::reference_signature()) {
2361      // The values below are fake but will force extra
2362      // non-static oop fields and a corresponding non-static
2363      // oop map block to be allocated.
2364      extra = 0;
2365      break;
2366    }
2367  }
2368  if (extra != 0) {
2369    fac_ptr->nonstatic_oop_count += extra;
2370    // Add the additional entry to "fields" so that the klass
2371    // contains the "discoverd" field and the field will be initialized
2372    // in instances of the object.
2373    int fields_with_fix_length = (*fields_ptr)()->length() +
2374      instanceKlass::next_offset;
2375    typeArrayOop ff = oopFactory::new_permanent_shortArray(
2376                                                fields_with_fix_length, CHECK);
2377    typeArrayHandle fields_with_fix(THREAD, ff);
2378
2379    // Take everything from the original but the length.
2380    for (int idx = 0; idx < (*fields_ptr)->length(); idx++) {
2381      fields_with_fix->ushort_at_put(idx, (*fields_ptr)->ushort_at(idx));
2382    }
2383
2384    // Add the fake field at the end.
2385    int i = (*fields_ptr)->length();
2386    // There is no name index for the fake "discovered" field nor
2387    // signature but a signature is needed so that the field will
2388    // be properly initialized.  Use one found for
2389    // one of the other reference fields. Be sure the index for the
2390    // name is 0.  In fieldDescriptor::initialize() the index of the
2391    // name is checked.  That check is by passed for the last nonstatic
2392    // oop field in a java.lang.ref.Reference which is assumed to be
2393    // this artificial "discovered" field.  An assertion checks that
2394    // the name index is 0.
2395    assert(reference_index != 0, "Missing signature for reference");
2396
2397    int j;
2398    for (j = 0; j < instanceKlass::next_offset; j++) {
2399      fields_with_fix->ushort_at_put(i + j,
2400        (*fields_ptr)->ushort_at(reference_index +j));
2401    }
2402    // Clear the public access flag and set the private access flag.
2403    short flags;
2404    flags =
2405      fields_with_fix->ushort_at(i + instanceKlass::access_flags_offset);
2406    assert(!(flags & JVM_RECOGNIZED_FIELD_MODIFIERS), "Unexpected access flags set");
2407    flags = flags & (~JVM_ACC_PUBLIC);
2408    flags = flags | JVM_ACC_PRIVATE;
2409    AccessFlags access_flags;
2410    access_flags.set_flags(flags);
2411    assert(!access_flags.is_public(), "Failed to clear public flag");
2412    assert(access_flags.is_private(), "Failed to set private flag");
2413    fields_with_fix->ushort_at_put(i + instanceKlass::access_flags_offset,
2414      flags);
2415
2416    assert(fields_with_fix->ushort_at(i + instanceKlass::name_index_offset)
2417      == reference_name_index, "The fake reference name is incorrect");
2418    assert(fields_with_fix->ushort_at(i + instanceKlass::signature_index_offset)
2419      == reference_sig_index, "The fake reference signature is incorrect");
2420    // The type of the field is stored in the low_offset entry during
2421    // parsing.
2422    assert(fields_with_fix->ushort_at(i + instanceKlass::low_offset) ==
2423      NONSTATIC_OOP, "The fake reference type is incorrect");
2424
2425    // "fields" is allocated in the permanent generation.  Disgard
2426    // it and let it be collected.
2427    (*fields_ptr) = fields_with_fix;
2428  }
2429  return;
2430}
2431
2432
2433void ClassFileParser::java_lang_Class_fix_pre(objArrayHandle* methods_ptr,
2434  FieldAllocationCount *fac_ptr, TRAPS) {
2435  // Add fake fields for java.lang.Class instances
2436  //
2437  // This is not particularly nice. We should consider adding a
2438  // private transient object field at the Java level to
2439  // java.lang.Class. Alternatively we could add a subclass of
2440  // instanceKlass which provides an accessor and size computer for
2441  // this field, but that appears to be more code than this hack.
2442  //
2443  // NOTE that we wedge these in at the beginning rather than the
2444  // end of the object because the Class layout changed between JDK
2445  // 1.3 and JDK 1.4 with the new reflection implementation; some
2446  // nonstatic oop fields were added at the Java level. The offsets
2447  // of these fake fields can't change between these two JDK
2448  // versions because when the offsets are computed at bootstrap
2449  // time we don't know yet which version of the JDK we're running in.
2450
2451  // The values below are fake but will force two non-static oop fields and
2452  // a corresponding non-static oop map block to be allocated.
2453  const int extra = java_lang_Class::number_of_fake_oop_fields;
2454  fac_ptr->nonstatic_oop_count += extra;
2455}
2456
2457
2458void ClassFileParser::java_lang_Class_fix_post(int* next_nonstatic_oop_offset_ptr) {
2459  // Cause the extra fake fields in java.lang.Class to show up before
2460  // the Java fields for layout compatibility between 1.3 and 1.4
2461  // Incrementing next_nonstatic_oop_offset here advances the
2462  // location where the real java fields are placed.
2463  const int extra = java_lang_Class::number_of_fake_oop_fields;
2464  (*next_nonstatic_oop_offset_ptr) += (extra * heapOopSize);
2465}
2466
2467
2468instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name,
2469                                                    Handle class_loader,
2470                                                    Handle protection_domain,
2471                                                    GrowableArray<Handle>* cp_patches,
2472                                                    symbolHandle& parsed_name,
2473                                                    TRAPS) {
2474  // So that JVMTI can cache class file in the state before retransformable agents
2475  // have modified it
2476  unsigned char *cached_class_file_bytes = NULL;
2477  jint cached_class_file_length;
2478
2479  ClassFileStream* cfs = stream();
2480  // Timing
2481  PerfTraceTime vmtimer(ClassLoader::perf_accumulated_time());
2482
2483  _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false;
2484
2485  if (JvmtiExport::should_post_class_file_load_hook()) {
2486    unsigned char* ptr = cfs->buffer();
2487    unsigned char* end_ptr = cfs->buffer() + cfs->length();
2488
2489    JvmtiExport::post_class_file_load_hook(name, class_loader, protection_domain,
2490                                           &ptr, &end_ptr,
2491                                           &cached_class_file_bytes,
2492                                           &cached_class_file_length);
2493
2494    if (ptr != cfs->buffer()) {
2495      // JVMTI agent has modified class file data.
2496      // Set new class file stream using JVMTI agent modified
2497      // class file data.
2498      cfs = new ClassFileStream(ptr, end_ptr - ptr, cfs->source());
2499      set_stream(cfs);
2500    }
2501  }
2502
2503  _cp_patches = cp_patches;
2504
2505  instanceKlassHandle nullHandle;
2506
2507  // Figure out whether we can skip format checking (matching classic VM behavior)
2508  _need_verify = Verifier::should_verify_for(class_loader());
2509
2510  // Set the verify flag in stream
2511  cfs->set_verify(_need_verify);
2512
2513  // Save the class file name for easier error message printing.
2514  _class_name = name.not_null()? name : vmSymbolHandles::unknown_class_name();
2515
2516  cfs->guarantee_more(8, CHECK_(nullHandle));  // magic, major, minor
2517  // Magic value
2518  u4 magic = cfs->get_u4_fast();
2519  guarantee_property(magic == JAVA_CLASSFILE_MAGIC,
2520                     "Incompatible magic value %u in class file %s",
2521                     magic, CHECK_(nullHandle));
2522
2523  // Version numbers
2524  u2 minor_version = cfs->get_u2_fast();
2525  u2 major_version = cfs->get_u2_fast();
2526
2527  // Check version numbers - we check this even with verifier off
2528  if (!is_supported_version(major_version, minor_version)) {
2529    if (name.is_null()) {
2530      Exceptions::fthrow(
2531        THREAD_AND_LOCATION,
2532        vmSymbolHandles::java_lang_UnsupportedClassVersionError(),
2533        "Unsupported major.minor version %u.%u",
2534        major_version,
2535        minor_version);
2536    } else {
2537      ResourceMark rm(THREAD);
2538      Exceptions::fthrow(
2539        THREAD_AND_LOCATION,
2540        vmSymbolHandles::java_lang_UnsupportedClassVersionError(),
2541        "%s : Unsupported major.minor version %u.%u",
2542        name->as_C_string(),
2543        major_version,
2544        minor_version);
2545    }
2546    return nullHandle;
2547  }
2548
2549  _major_version = major_version;
2550  _minor_version = minor_version;
2551
2552
2553  // Check if verification needs to be relaxed for this class file
2554  // Do not restrict it to jdk1.0 or jdk1.1 to maintain backward compatibility (4982376)
2555  _relax_verify = Verifier::relax_verify_for(class_loader());
2556
2557  // Constant pool
2558  constantPoolHandle cp = parse_constant_pool(CHECK_(nullHandle));
2559  int cp_size = cp->length();
2560
2561  cfs->guarantee_more(8, CHECK_(nullHandle));  // flags, this_class, super_class, infs_len
2562
2563  // Access flags
2564  AccessFlags access_flags;
2565  jint flags = cfs->get_u2_fast() & JVM_RECOGNIZED_CLASS_MODIFIERS;
2566
2567  if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) {
2568    // Set abstract bit for old class files for backward compatibility
2569    flags |= JVM_ACC_ABSTRACT;
2570  }
2571  verify_legal_class_modifiers(flags, CHECK_(nullHandle));
2572  access_flags.set_flags(flags);
2573
2574  // This class and superclass
2575  instanceKlassHandle super_klass;
2576  u2 this_class_index = cfs->get_u2_fast();
2577  check_property(
2578    valid_cp_range(this_class_index, cp_size) &&
2579      cp->tag_at(this_class_index).is_unresolved_klass(),
2580    "Invalid this class index %u in constant pool in class file %s",
2581    this_class_index, CHECK_(nullHandle));
2582
2583  symbolHandle class_name (THREAD, cp->unresolved_klass_at(this_class_index));
2584  assert(class_name.not_null(), "class_name can't be null");
2585
2586  // It's important to set parsed_name *before* resolving the super class.
2587  // (it's used for cleanup by the caller if parsing fails)
2588  parsed_name = class_name;
2589
2590  // Update _class_name which could be null previously to be class_name
2591  _class_name = class_name;
2592
2593  // Don't need to check whether this class name is legal or not.
2594  // It has been checked when constant pool is parsed.
2595  // However, make sure it is not an array type.
2596  if (_need_verify) {
2597    guarantee_property(class_name->byte_at(0) != JVM_SIGNATURE_ARRAY,
2598                       "Bad class name in class file %s",
2599                       CHECK_(nullHandle));
2600  }
2601
2602  klassOop preserve_this_klass;   // for storing result across HandleMark
2603
2604  // release all handles when parsing is done
2605  { HandleMark hm(THREAD);
2606
2607    // Checks if name in class file matches requested name
2608    if (name.not_null() && class_name() != name()) {
2609      ResourceMark rm(THREAD);
2610      Exceptions::fthrow(
2611        THREAD_AND_LOCATION,
2612        vmSymbolHandles::java_lang_NoClassDefFoundError(),
2613        "%s (wrong name: %s)",
2614        name->as_C_string(),
2615        class_name->as_C_string()
2616      );
2617      return nullHandle;
2618    }
2619
2620    if (TraceClassLoadingPreorder) {
2621      tty->print("[Loading %s", name()->as_klass_external_name());
2622      if (cfs->source() != NULL) tty->print(" from %s", cfs->source());
2623      tty->print_cr("]");
2624    }
2625
2626    u2 super_class_index = cfs->get_u2_fast();
2627    if (super_class_index == 0) {
2628      check_property(class_name() == vmSymbols::java_lang_Object(),
2629                     "Invalid superclass index %u in class file %s",
2630                     super_class_index,
2631                     CHECK_(nullHandle));
2632    } else {
2633      check_property(valid_cp_range(super_class_index, cp_size) &&
2634                     is_klass_reference(cp, super_class_index),
2635                     "Invalid superclass index %u in class file %s",
2636                     super_class_index,
2637                     CHECK_(nullHandle));
2638      // The class name should be legal because it is checked when parsing constant pool.
2639      // However, make sure it is not an array type.
2640      bool is_array = false;
2641      if (cp->tag_at(super_class_index).is_klass()) {
2642        super_klass = instanceKlassHandle(THREAD, cp->resolved_klass_at(super_class_index));
2643        if (_need_verify)
2644          is_array = super_klass->oop_is_array();
2645      } else if (_need_verify) {
2646        is_array = (cp->unresolved_klass_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY);
2647      }
2648      if (_need_verify) {
2649        guarantee_property(!is_array,
2650                          "Bad superclass name in class file %s", CHECK_(nullHandle));
2651      }
2652    }
2653
2654    // Interfaces
2655    u2 itfs_len = cfs->get_u2_fast();
2656    objArrayHandle local_interfaces;
2657    if (itfs_len == 0) {
2658      local_interfaces = objArrayHandle(THREAD, Universe::the_empty_system_obj_array());
2659    } else {
2660      local_interfaces = parse_interfaces(cp, itfs_len, class_loader, protection_domain, &vmtimer, _class_name, CHECK_(nullHandle));
2661    }
2662
2663    // Fields (offsets are filled in later)
2664    struct FieldAllocationCount fac = {0,0,0,0,0,0,0,0,0,0};
2665    objArrayHandle fields_annotations;
2666    typeArrayHandle fields = parse_fields(cp, access_flags.is_interface(), &fac, &fields_annotations, CHECK_(nullHandle));
2667    // Methods
2668    bool has_final_method = false;
2669    AccessFlags promoted_flags;
2670    promoted_flags.set_flags(0);
2671    // These need to be oop pointers because they are allocated lazily
2672    // inside parse_methods inside a nested HandleMark
2673    objArrayOop methods_annotations_oop = NULL;
2674    objArrayOop methods_parameter_annotations_oop = NULL;
2675    objArrayOop methods_default_annotations_oop = NULL;
2676    objArrayHandle methods = parse_methods(cp, access_flags.is_interface(),
2677                                           &promoted_flags,
2678                                           &has_final_method,
2679                                           &methods_annotations_oop,
2680                                           &methods_parameter_annotations_oop,
2681                                           &methods_default_annotations_oop,
2682                                           CHECK_(nullHandle));
2683
2684    objArrayHandle methods_annotations(THREAD, methods_annotations_oop);
2685    objArrayHandle methods_parameter_annotations(THREAD, methods_parameter_annotations_oop);
2686    objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop);
2687
2688    // We check super class after class file is parsed and format is checked
2689    if (super_class_index > 0 && super_klass.is_null()) {
2690      symbolHandle sk (THREAD, cp->klass_name_at(super_class_index));
2691      if (access_flags.is_interface()) {
2692        // Before attempting to resolve the superclass, check for class format
2693        // errors not checked yet.
2694        guarantee_property(sk() == vmSymbols::java_lang_Object(),
2695                           "Interfaces must have java.lang.Object as superclass in class file %s",
2696                           CHECK_(nullHandle));
2697      }
2698      klassOop k = SystemDictionary::resolve_super_or_fail(class_name,
2699                                                           sk,
2700                                                           class_loader,
2701                                                           protection_domain,
2702                                                           true,
2703                                                           CHECK_(nullHandle));
2704      KlassHandle kh (THREAD, k);
2705      super_klass = instanceKlassHandle(THREAD, kh());
2706      if (LinkWellKnownClasses)  // my super class is well known to me
2707        cp->klass_at_put(super_class_index, super_klass()); // eagerly resolve
2708    }
2709    if (super_klass.not_null()) {
2710      if (super_klass->is_interface()) {
2711        ResourceMark rm(THREAD);
2712        Exceptions::fthrow(
2713          THREAD_AND_LOCATION,
2714          vmSymbolHandles::java_lang_IncompatibleClassChangeError(),
2715          "class %s has interface %s as super class",
2716          class_name->as_klass_external_name(),
2717          super_klass->external_name()
2718        );
2719        return nullHandle;
2720      }
2721      // Make sure super class is not final
2722      if (super_klass->is_final()) {
2723        THROW_MSG_(vmSymbols::java_lang_VerifyError(), "Cannot inherit from final class", nullHandle);
2724      }
2725    }
2726
2727    // Compute the transitive list of all unique interfaces implemented by this class
2728    objArrayHandle transitive_interfaces = compute_transitive_interfaces(super_klass, local_interfaces, CHECK_(nullHandle));
2729
2730    // sort methods
2731    typeArrayHandle method_ordering = sort_methods(methods,
2732                                                   methods_annotations,
2733                                                   methods_parameter_annotations,
2734                                                   methods_default_annotations,
2735                                                   CHECK_(nullHandle));
2736
2737    // promote flags from parse_methods() to the klass' flags
2738    access_flags.add_promoted_flags(promoted_flags.as_int());
2739
2740    // Size of Java vtable (in words)
2741    int vtable_size = 0;
2742    int itable_size = 0;
2743    int num_miranda_methods = 0;
2744
2745    klassVtable::compute_vtable_size_and_num_mirandas(vtable_size,
2746                                                      num_miranda_methods,
2747                                                      super_klass(),
2748                                                      methods(),
2749                                                      access_flags,
2750                                                      class_loader(),
2751                                                      class_name(),
2752                                                      local_interfaces());
2753
2754    // Size of Java itable (in words)
2755    itable_size = access_flags.is_interface() ? 0 : klassItable::compute_itable_size(transitive_interfaces);
2756
2757    // Field size and offset computation
2758    int nonstatic_field_size = super_klass() == NULL ? 0 : super_klass->nonstatic_field_size();
2759#ifndef PRODUCT
2760    int orig_nonstatic_field_size = 0;
2761#endif
2762    int static_field_size = 0;
2763    int next_static_oop_offset;
2764    int next_static_double_offset;
2765    int next_static_word_offset;
2766    int next_static_short_offset;
2767    int next_static_byte_offset;
2768    int next_static_type_offset;
2769    int next_nonstatic_oop_offset;
2770    int next_nonstatic_double_offset;
2771    int next_nonstatic_word_offset;
2772    int next_nonstatic_short_offset;
2773    int next_nonstatic_byte_offset;
2774    int next_nonstatic_type_offset;
2775    int first_nonstatic_oop_offset;
2776    int first_nonstatic_field_offset;
2777    int next_nonstatic_field_offset;
2778
2779    // Calculate the starting byte offsets
2780    next_static_oop_offset      = (instanceKlass::header_size() +
2781                                  align_object_offset(vtable_size) +
2782                                  align_object_offset(itable_size)) * wordSize;
2783    next_static_double_offset   = next_static_oop_offset +
2784                                  (fac.static_oop_count * heapOopSize);
2785    if ( fac.static_double_count &&
2786         (Universe::field_type_should_be_aligned(T_DOUBLE) ||
2787          Universe::field_type_should_be_aligned(T_LONG)) ) {
2788      next_static_double_offset = align_size_up(next_static_double_offset, BytesPerLong);
2789    }
2790
2791    next_static_word_offset     = next_static_double_offset +
2792                                  (fac.static_double_count * BytesPerLong);
2793    next_static_short_offset    = next_static_word_offset +
2794                                  (fac.static_word_count * BytesPerInt);
2795    next_static_byte_offset     = next_static_short_offset +
2796                                  (fac.static_short_count * BytesPerShort);
2797    next_static_type_offset     = align_size_up((next_static_byte_offset +
2798                                  fac.static_byte_count ), wordSize );
2799    static_field_size           = (next_static_type_offset -
2800                                  next_static_oop_offset) / wordSize;
2801    first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
2802                                   nonstatic_field_size * heapOopSize;
2803    next_nonstatic_field_offset = first_nonstatic_field_offset;
2804
2805    // Add fake fields for java.lang.Class instances (also see below)
2806    if (class_name() == vmSymbols::java_lang_Class() && class_loader.is_null()) {
2807      java_lang_Class_fix_pre(&methods, &fac, CHECK_(nullHandle));
2808    }
2809
2810    // Add a fake "discovered" field if it is not present
2811    // for compatibility with earlier jdk's.
2812    if (class_name() == vmSymbols::java_lang_ref_Reference()
2813      && class_loader.is_null()) {
2814      java_lang_ref_Reference_fix_pre(&fields, cp, &fac, CHECK_(nullHandle));
2815    }
2816    // end of "discovered" field compactibility fix
2817
2818    int nonstatic_double_count = fac.nonstatic_double_count;
2819    int nonstatic_word_count   = fac.nonstatic_word_count;
2820    int nonstatic_short_count  = fac.nonstatic_short_count;
2821    int nonstatic_byte_count   = fac.nonstatic_byte_count;
2822    int nonstatic_oop_count    = fac.nonstatic_oop_count;
2823
2824    bool super_has_nonstatic_fields =
2825            (super_klass() != NULL && super_klass->has_nonstatic_fields());
2826    bool has_nonstatic_fields  =  super_has_nonstatic_fields ||
2827            ((nonstatic_double_count + nonstatic_word_count +
2828              nonstatic_short_count + nonstatic_byte_count +
2829              nonstatic_oop_count) != 0);
2830
2831
2832    // Prepare list of oops for oop maps generation.
2833    u2* nonstatic_oop_offsets;
2834    u2* nonstatic_oop_length;
2835    int nonstatic_oop_map_count = 0;
2836
2837    nonstatic_oop_offsets = NEW_RESOURCE_ARRAY_IN_THREAD(
2838              THREAD, u2,  nonstatic_oop_count+1);
2839    nonstatic_oop_length  = NEW_RESOURCE_ARRAY_IN_THREAD(
2840              THREAD, u2,  nonstatic_oop_count+1);
2841
2842    // Add fake fields for java.lang.Class instances (also see above).
2843    // FieldsAllocationStyle and CompactFields values will be reset to default.
2844    if(class_name() == vmSymbols::java_lang_Class() && class_loader.is_null()) {
2845      java_lang_Class_fix_post(&next_nonstatic_field_offset);
2846      nonstatic_oop_offsets[0] = (u2)first_nonstatic_field_offset;
2847      int fake_oop_count       = (( next_nonstatic_field_offset -
2848                                    first_nonstatic_field_offset ) / heapOopSize);
2849      nonstatic_oop_length [0] = (u2)fake_oop_count;
2850      nonstatic_oop_map_count  = 1;
2851      nonstatic_oop_count     -= fake_oop_count;
2852      first_nonstatic_oop_offset = first_nonstatic_field_offset;
2853    } else {
2854      first_nonstatic_oop_offset = 0; // will be set for first oop field
2855    }
2856
2857#ifndef PRODUCT
2858    if( PrintCompactFieldsSavings ) {
2859      next_nonstatic_double_offset = next_nonstatic_field_offset +
2860                                     (nonstatic_oop_count * heapOopSize);
2861      if ( nonstatic_double_count > 0 ) {
2862        next_nonstatic_double_offset = align_size_up(next_nonstatic_double_offset, BytesPerLong);
2863      }
2864      next_nonstatic_word_offset  = next_nonstatic_double_offset +
2865                                    (nonstatic_double_count * BytesPerLong);
2866      next_nonstatic_short_offset = next_nonstatic_word_offset +
2867                                    (nonstatic_word_count * BytesPerInt);
2868      next_nonstatic_byte_offset  = next_nonstatic_short_offset +
2869                                    (nonstatic_short_count * BytesPerShort);
2870      next_nonstatic_type_offset  = align_size_up((next_nonstatic_byte_offset +
2871                                    nonstatic_byte_count ), heapOopSize );
2872      orig_nonstatic_field_size   = nonstatic_field_size +
2873      ((next_nonstatic_type_offset - first_nonstatic_field_offset)/heapOopSize);
2874    }
2875#endif
2876    bool compact_fields   = CompactFields;
2877    int  allocation_style = FieldsAllocationStyle;
2878    if( allocation_style < 0 || allocation_style > 1 ) { // Out of range?
2879      assert(false, "0 <= FieldsAllocationStyle <= 1");
2880      allocation_style = 1; // Optimistic
2881    }
2882
2883    // The next classes have predefined hard-coded fields offsets
2884    // (see in JavaClasses::compute_hard_coded_offsets()).
2885    // Use default fields allocation order for them.
2886    if( (allocation_style != 0 || compact_fields ) && class_loader.is_null() &&
2887        (class_name() == vmSymbols::java_lang_AssertionStatusDirectives() ||
2888         class_name() == vmSymbols::java_lang_Class() ||
2889         class_name() == vmSymbols::java_lang_ClassLoader() ||
2890         class_name() == vmSymbols::java_lang_ref_Reference() ||
2891         class_name() == vmSymbols::java_lang_ref_SoftReference() ||
2892         class_name() == vmSymbols::java_lang_StackTraceElement() ||
2893         class_name() == vmSymbols::java_lang_String() ||
2894         class_name() == vmSymbols::java_lang_Throwable() ||
2895         class_name() == vmSymbols::java_lang_Boolean() ||
2896         class_name() == vmSymbols::java_lang_Character() ||
2897         class_name() == vmSymbols::java_lang_Float() ||
2898         class_name() == vmSymbols::java_lang_Double() ||
2899         class_name() == vmSymbols::java_lang_Byte() ||
2900         class_name() == vmSymbols::java_lang_Short() ||
2901         class_name() == vmSymbols::java_lang_Integer() ||
2902         class_name() == vmSymbols::java_lang_Long())) {
2903      allocation_style = 0;     // Allocate oops first
2904      compact_fields   = false; // Don't compact fields
2905    }
2906
2907    if( allocation_style == 0 ) {
2908      // Fields order: oops, longs/doubles, ints, shorts/chars, bytes
2909      next_nonstatic_oop_offset    = next_nonstatic_field_offset;
2910      next_nonstatic_double_offset = next_nonstatic_oop_offset +
2911                                      (nonstatic_oop_count * heapOopSize);
2912    } else if( allocation_style == 1 ) {
2913      // Fields order: longs/doubles, ints, shorts/chars, bytes, oops
2914      next_nonstatic_double_offset = next_nonstatic_field_offset;
2915    } else {
2916      ShouldNotReachHere();
2917    }
2918
2919    int nonstatic_oop_space_count   = 0;
2920    int nonstatic_word_space_count  = 0;
2921    int nonstatic_short_space_count = 0;
2922    int nonstatic_byte_space_count  = 0;
2923    int nonstatic_oop_space_offset;
2924    int nonstatic_word_space_offset;
2925    int nonstatic_short_space_offset;
2926    int nonstatic_byte_space_offset;
2927
2928    if( nonstatic_double_count > 0 ) {
2929      int offset = next_nonstatic_double_offset;
2930      next_nonstatic_double_offset = align_size_up(offset, BytesPerLong);
2931      if( compact_fields && offset != next_nonstatic_double_offset ) {
2932        // Allocate available fields into the gap before double field.
2933        int length = next_nonstatic_double_offset - offset;
2934        assert(length == BytesPerInt, "");
2935        nonstatic_word_space_offset = offset;
2936        if( nonstatic_word_count > 0 ) {
2937          nonstatic_word_count      -= 1;
2938          nonstatic_word_space_count = 1; // Only one will fit
2939          length -= BytesPerInt;
2940          offset += BytesPerInt;
2941        }
2942        nonstatic_short_space_offset = offset;
2943        while( length >= BytesPerShort && nonstatic_short_count > 0 ) {
2944          nonstatic_short_count       -= 1;
2945          nonstatic_short_space_count += 1;
2946          length -= BytesPerShort;
2947          offset += BytesPerShort;
2948        }
2949        nonstatic_byte_space_offset = offset;
2950        while( length > 0 && nonstatic_byte_count > 0 ) {
2951          nonstatic_byte_count       -= 1;
2952          nonstatic_byte_space_count += 1;
2953          length -= 1;
2954        }
2955        // Allocate oop field in the gap if there are no other fields for that.
2956        nonstatic_oop_space_offset = offset;
2957        if( length >= heapOopSize && nonstatic_oop_count > 0 &&
2958            allocation_style != 0 ) { // when oop fields not first
2959          nonstatic_oop_count      -= 1;
2960          nonstatic_oop_space_count = 1; // Only one will fit
2961          length -= heapOopSize;
2962          offset += heapOopSize;
2963        }
2964      }
2965    }
2966
2967    next_nonstatic_word_offset  = next_nonstatic_double_offset +
2968                                  (nonstatic_double_count * BytesPerLong);
2969    next_nonstatic_short_offset = next_nonstatic_word_offset +
2970                                  (nonstatic_word_count * BytesPerInt);
2971    next_nonstatic_byte_offset  = next_nonstatic_short_offset +
2972                                  (nonstatic_short_count * BytesPerShort);
2973
2974    int notaligned_offset;
2975    if( allocation_style == 0 ) {
2976      notaligned_offset = next_nonstatic_byte_offset + nonstatic_byte_count;
2977    } else { // allocation_style == 1
2978      next_nonstatic_oop_offset = next_nonstatic_byte_offset + nonstatic_byte_count;
2979      if( nonstatic_oop_count > 0 ) {
2980        next_nonstatic_oop_offset = align_size_up(next_nonstatic_oop_offset, heapOopSize);
2981      }
2982      notaligned_offset = next_nonstatic_oop_offset + (nonstatic_oop_count * heapOopSize);
2983    }
2984    next_nonstatic_type_offset = align_size_up(notaligned_offset, heapOopSize );
2985    nonstatic_field_size = nonstatic_field_size + ((next_nonstatic_type_offset
2986                                   - first_nonstatic_field_offset)/heapOopSize);
2987
2988    // Iterate over fields again and compute correct offsets.
2989    // The field allocation type was temporarily stored in the offset slot.
2990    // oop fields are located before non-oop fields (static and non-static).
2991    int len = fields->length();
2992    for (int i = 0; i < len; i += instanceKlass::next_offset) {
2993      int real_offset;
2994      FieldAllocationType atype = (FieldAllocationType) fields->ushort_at(i+4);
2995      switch (atype) {
2996        case STATIC_OOP:
2997          real_offset = next_static_oop_offset;
2998          next_static_oop_offset += heapOopSize;
2999          break;
3000        case STATIC_BYTE:
3001          real_offset = next_static_byte_offset;
3002          next_static_byte_offset += 1;
3003          break;
3004        case STATIC_SHORT:
3005          real_offset = next_static_short_offset;
3006          next_static_short_offset += BytesPerShort;
3007          break;
3008        case STATIC_WORD:
3009          real_offset = next_static_word_offset;
3010          next_static_word_offset += BytesPerInt;
3011          break;
3012        case STATIC_ALIGNED_DOUBLE:
3013        case STATIC_DOUBLE:
3014          real_offset = next_static_double_offset;
3015          next_static_double_offset += BytesPerLong;
3016          break;
3017        case NONSTATIC_OOP:
3018          if( nonstatic_oop_space_count > 0 ) {
3019            real_offset = nonstatic_oop_space_offset;
3020            nonstatic_oop_space_offset += heapOopSize;
3021            nonstatic_oop_space_count  -= 1;
3022          } else {
3023            real_offset = next_nonstatic_oop_offset;
3024            next_nonstatic_oop_offset += heapOopSize;
3025          }
3026          // Update oop maps
3027          if( nonstatic_oop_map_count > 0 &&
3028              nonstatic_oop_offsets[nonstatic_oop_map_count - 1] ==
3029              (u2)(real_offset - nonstatic_oop_length[nonstatic_oop_map_count - 1] * heapOopSize) ) {
3030            // Extend current oop map
3031            nonstatic_oop_length[nonstatic_oop_map_count - 1] += 1;
3032          } else {
3033            // Create new oop map
3034            nonstatic_oop_offsets[nonstatic_oop_map_count] = (u2)real_offset;
3035            nonstatic_oop_length [nonstatic_oop_map_count] = 1;
3036            nonstatic_oop_map_count += 1;
3037            if( first_nonstatic_oop_offset == 0 ) { // Undefined
3038              first_nonstatic_oop_offset = real_offset;
3039            }
3040          }
3041          break;
3042        case NONSTATIC_BYTE:
3043          if( nonstatic_byte_space_count > 0 ) {
3044            real_offset = nonstatic_byte_space_offset;
3045            nonstatic_byte_space_offset += 1;
3046            nonstatic_byte_space_count  -= 1;
3047          } else {
3048            real_offset = next_nonstatic_byte_offset;
3049            next_nonstatic_byte_offset += 1;
3050          }
3051          break;
3052        case NONSTATIC_SHORT:
3053          if( nonstatic_short_space_count > 0 ) {
3054            real_offset = nonstatic_short_space_offset;
3055            nonstatic_short_space_offset += BytesPerShort;
3056            nonstatic_short_space_count  -= 1;
3057          } else {
3058            real_offset = next_nonstatic_short_offset;
3059            next_nonstatic_short_offset += BytesPerShort;
3060          }
3061          break;
3062        case NONSTATIC_WORD:
3063          if( nonstatic_word_space_count > 0 ) {
3064            real_offset = nonstatic_word_space_offset;
3065            nonstatic_word_space_offset += BytesPerInt;
3066            nonstatic_word_space_count  -= 1;
3067          } else {
3068            real_offset = next_nonstatic_word_offset;
3069            next_nonstatic_word_offset += BytesPerInt;
3070          }
3071          break;
3072        case NONSTATIC_ALIGNED_DOUBLE:
3073        case NONSTATIC_DOUBLE:
3074          real_offset = next_nonstatic_double_offset;
3075          next_nonstatic_double_offset += BytesPerLong;
3076          break;
3077        default:
3078          ShouldNotReachHere();
3079      }
3080      fields->short_at_put(i+4, extract_low_short_from_int(real_offset) );
3081      fields->short_at_put(i+5, extract_high_short_from_int(real_offset) );
3082    }
3083
3084    // Size of instances
3085    int instance_size;
3086
3087    next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize );
3088    instance_size = align_object_size(next_nonstatic_type_offset / wordSize);
3089
3090    assert(instance_size == align_object_size(align_size_up((instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize), wordSize) / wordSize), "consistent layout helper value");
3091
3092    // Size of non-static oop map blocks (in words) allocated at end of klass
3093    int nonstatic_oop_map_size = compute_oop_map_size(super_klass, nonstatic_oop_map_count, first_nonstatic_oop_offset);
3094
3095    // Compute reference type
3096    ReferenceType rt;
3097    if (super_klass() == NULL) {
3098      rt = REF_NONE;
3099    } else {
3100      rt = super_klass->reference_type();
3101    }
3102
3103    // We can now create the basic klassOop for this klass
3104    klassOop ik = oopFactory::new_instanceKlass(
3105                                    vtable_size, itable_size,
3106                                    static_field_size, nonstatic_oop_map_size,
3107                                    rt, CHECK_(nullHandle));
3108    instanceKlassHandle this_klass (THREAD, ik);
3109
3110    assert(this_klass->static_field_size() == static_field_size &&
3111           this_klass->nonstatic_oop_map_size() == nonstatic_oop_map_size, "sanity check");
3112
3113    // Fill in information already parsed
3114    this_klass->set_access_flags(access_flags);
3115    jint lh = Klass::instance_layout_helper(instance_size, false);
3116    this_klass->set_layout_helper(lh);
3117    assert(this_klass->oop_is_instance(), "layout is correct");
3118    assert(this_klass->size_helper() == instance_size, "correct size_helper");
3119    // Not yet: supers are done below to support the new subtype-checking fields
3120    //this_klass->set_super(super_klass());
3121    this_klass->set_class_loader(class_loader());
3122    this_klass->set_nonstatic_field_size(nonstatic_field_size);
3123    this_klass->set_has_nonstatic_fields(has_nonstatic_fields);
3124    this_klass->set_static_oop_field_size(fac.static_oop_count);
3125    cp->set_pool_holder(this_klass());
3126    this_klass->set_constants(cp());
3127    this_klass->set_local_interfaces(local_interfaces());
3128    this_klass->set_fields(fields());
3129    this_klass->set_methods(methods());
3130    if (has_final_method) {
3131      this_klass->set_has_final_method();
3132    }
3133    this_klass->set_method_ordering(method_ordering());
3134    this_klass->set_initial_method_idnum(methods->length());
3135    this_klass->set_name(cp->klass_name_at(this_class_index));
3136    if (LinkWellKnownClasses)  // I am well known to myself
3137      cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve
3138    this_klass->set_protection_domain(protection_domain());
3139    this_klass->set_fields_annotations(fields_annotations());
3140    this_klass->set_methods_annotations(methods_annotations());
3141    this_klass->set_methods_parameter_annotations(methods_parameter_annotations());
3142    this_klass->set_methods_default_annotations(methods_default_annotations());
3143
3144    this_klass->set_minor_version(minor_version);
3145    this_klass->set_major_version(major_version);
3146
3147    if (cached_class_file_bytes != NULL) {
3148      // JVMTI: we have an instanceKlass now, tell it about the cached bytes
3149      this_klass->set_cached_class_file(cached_class_file_bytes,
3150                                        cached_class_file_length);
3151    }
3152
3153    // Miranda methods
3154    if ((num_miranda_methods > 0) ||
3155        // if this class introduced new miranda methods or
3156        (super_klass.not_null() && (super_klass->has_miranda_methods()))
3157        // super class exists and this class inherited miranda methods
3158        ) {
3159      this_klass->set_has_miranda_methods(); // then set a flag
3160    }
3161
3162    // Additional attributes
3163    parse_classfile_attributes(cp, this_klass, CHECK_(nullHandle));
3164
3165    // Make sure this is the end of class file stream
3166    guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
3167
3168    // Initialize static fields
3169    this_klass->do_local_static_fields(&initialize_static_field, CHECK_(nullHandle));
3170
3171    // VerifyOops believes that once this has been set, the object is completely loaded.
3172    // Compute transitive closure of interfaces this class implements
3173    this_klass->set_transitive_interfaces(transitive_interfaces());
3174
3175    // Fill in information needed to compute superclasses.
3176    this_klass->initialize_supers(super_klass(), CHECK_(nullHandle));
3177
3178    // Initialize itable offset tables
3179    klassItable::setup_itable_offset_table(this_klass);
3180
3181    // Do final class setup
3182    fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_length);
3183
3184    set_precomputed_flags(this_klass);
3185
3186    // reinitialize modifiers, using the InnerClasses attribute
3187    int computed_modifiers = this_klass->compute_modifier_flags(CHECK_(nullHandle));
3188    this_klass->set_modifier_flags(computed_modifiers);
3189
3190    // check if this class can access its super class
3191    check_super_class_access(this_klass, CHECK_(nullHandle));
3192
3193    // check if this class can access its superinterfaces
3194    check_super_interface_access(this_klass, CHECK_(nullHandle));
3195
3196    // check if this class overrides any final method
3197    check_final_method_override(this_klass, CHECK_(nullHandle));
3198
3199    // check that if this class is an interface then it doesn't have static methods
3200    if (this_klass->is_interface()) {
3201      check_illegal_static_method(this_klass, CHECK_(nullHandle));
3202    }
3203
3204    ClassLoadingService::notify_class_loaded(instanceKlass::cast(this_klass()),
3205                                             false /* not shared class */);
3206
3207    if (TraceClassLoading) {
3208      // print in a single call to reduce interleaving of output
3209      if (cfs->source() != NULL) {
3210        tty->print("[Loaded %s from %s]\n", this_klass->external_name(),
3211                   cfs->source());
3212      } else if (class_loader.is_null()) {
3213        if (THREAD->is_Java_thread()) {
3214          klassOop caller = ((JavaThread*)THREAD)->security_get_caller_class(1);
3215          tty->print("[Loaded %s by instance of %s]\n",
3216                     this_klass->external_name(),
3217                     instanceKlass::cast(caller)->external_name());
3218        } else {
3219          tty->print("[Loaded %s]\n", this_klass->external_name());
3220        }
3221      } else {
3222        ResourceMark rm;
3223        tty->print("[Loaded %s from %s]\n", this_klass->external_name(),
3224                   instanceKlass::cast(class_loader->klass())->external_name());
3225      }
3226    }
3227
3228    if (TraceClassResolution) {
3229      // print out the superclass.
3230      const char * from = Klass::cast(this_klass())->external_name();
3231      if (this_klass->java_super() != NULL) {
3232        tty->print("RESOLVE %s %s\n", from, instanceKlass::cast(this_klass->java_super())->external_name());
3233      }
3234      // print out each of the interface classes referred to by this class.
3235      objArrayHandle local_interfaces(THREAD, this_klass->local_interfaces());
3236      if (!local_interfaces.is_null()) {
3237        int length = local_interfaces->length();
3238        for (int i = 0; i < length; i++) {
3239          klassOop k = klassOop(local_interfaces->obj_at(i));
3240          instanceKlass* to_class = instanceKlass::cast(k);
3241          const char * to = to_class->external_name();
3242          tty->print("RESOLVE %s %s\n", from, to);
3243        }
3244      }
3245    }
3246
3247#ifndef PRODUCT
3248    if( PrintCompactFieldsSavings ) {
3249      if( nonstatic_field_size < orig_nonstatic_field_size ) {
3250        tty->print("[Saved %d of %d bytes in %s]\n",
3251                 (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize,
3252                 orig_nonstatic_field_size*heapOopSize,
3253                 this_klass->external_name());
3254      } else if( nonstatic_field_size > orig_nonstatic_field_size ) {
3255        tty->print("[Wasted %d over %d bytes in %s]\n",
3256                 (nonstatic_field_size - orig_nonstatic_field_size)*heapOopSize,
3257                 orig_nonstatic_field_size*heapOopSize,
3258                 this_klass->external_name());
3259      }
3260    }
3261#endif
3262
3263    // preserve result across HandleMark
3264    preserve_this_klass = this_klass();
3265  }
3266
3267  // Create new handle outside HandleMark
3268  instanceKlassHandle this_klass (THREAD, preserve_this_klass);
3269  debug_only(this_klass->as_klassOop()->verify();)
3270
3271  return this_klass;
3272}
3273
3274
3275int ClassFileParser::compute_oop_map_size(instanceKlassHandle super, int nonstatic_oop_map_count, int first_nonstatic_oop_offset) {
3276  int map_size = super.is_null() ? 0 : super->nonstatic_oop_map_size();
3277  if (nonstatic_oop_map_count > 0) {
3278    // We have oops to add to map
3279    if (map_size == 0) {
3280      map_size = nonstatic_oop_map_count;
3281    } else {
3282      // Check whether we should add a new map block or whether the last one can be extended
3283      OopMapBlock* first_map = super->start_of_nonstatic_oop_maps();
3284      OopMapBlock* last_map = first_map + map_size - 1;
3285
3286      int next_offset = last_map->offset() + (last_map->length() * heapOopSize);
3287      if (next_offset == first_nonstatic_oop_offset) {
3288        // There is no gap bettwen superklass's last oop field and first
3289        // local oop field, merge maps.
3290        nonstatic_oop_map_count -= 1;
3291      } else {
3292        // Superklass didn't end with a oop field, add extra maps
3293        assert(next_offset<first_nonstatic_oop_offset, "just checking");
3294      }
3295      map_size += nonstatic_oop_map_count;
3296    }
3297  }
3298  return map_size;
3299}
3300
3301
3302void ClassFileParser::fill_oop_maps(instanceKlassHandle k,
3303                        int nonstatic_oop_map_count,
3304                        u2* nonstatic_oop_offsets, u2* nonstatic_oop_length) {
3305  OopMapBlock* this_oop_map = k->start_of_nonstatic_oop_maps();
3306  OopMapBlock* last_oop_map = this_oop_map + k->nonstatic_oop_map_size();
3307  instanceKlass* super = k->superklass();
3308  if (super != NULL) {
3309    int super_oop_map_size     = super->nonstatic_oop_map_size();
3310    OopMapBlock* super_oop_map = super->start_of_nonstatic_oop_maps();
3311    // Copy maps from superklass
3312    while (super_oop_map_size-- > 0) {
3313      *this_oop_map++ = *super_oop_map++;
3314    }
3315  }
3316  if (nonstatic_oop_map_count > 0) {
3317    if (this_oop_map + nonstatic_oop_map_count > last_oop_map) {
3318      // Calculated in compute_oop_map_size() number of oop maps is less then
3319      // collected oop maps since there is no gap between superklass's last oop
3320      // field and first local oop field. Extend the last oop map copied
3321      // from the superklass instead of creating new one.
3322      nonstatic_oop_map_count--;
3323      nonstatic_oop_offsets++;
3324      this_oop_map--;
3325      this_oop_map->set_length(this_oop_map->length() + *nonstatic_oop_length++);
3326      this_oop_map++;
3327    }
3328    assert((this_oop_map + nonstatic_oop_map_count) == last_oop_map, "just checking");
3329    // Add new map blocks, fill them
3330    while (nonstatic_oop_map_count-- > 0) {
3331      this_oop_map->set_offset(*nonstatic_oop_offsets++);
3332      this_oop_map->set_length(*nonstatic_oop_length++);
3333      this_oop_map++;
3334    }
3335  }
3336}
3337
3338
3339void ClassFileParser::set_precomputed_flags(instanceKlassHandle k) {
3340  klassOop super = k->super();
3341
3342  // Check if this klass has an empty finalize method (i.e. one with return bytecode only),
3343  // in which case we don't have to register objects as finalizable
3344  if (!_has_empty_finalizer) {
3345    if (_has_finalizer ||
3346        (super != NULL && super->klass_part()->has_finalizer())) {
3347      k->set_has_finalizer();
3348    }
3349  }
3350
3351#ifdef ASSERT
3352  bool f = false;
3353  methodOop m = k->lookup_method(vmSymbols::finalize_method_name(),
3354                                 vmSymbols::void_method_signature());
3355  if (m != NULL && !m->is_empty_method()) {
3356    f = true;
3357  }
3358  assert(f == k->has_finalizer(), "inconsistent has_finalizer");
3359#endif
3360
3361  // Check if this klass supports the java.lang.Cloneable interface
3362  if (SystemDictionary::cloneable_klass_loaded()) {
3363    if (k->is_subtype_of(SystemDictionary::cloneable_klass())) {
3364      k->set_is_cloneable();
3365    }
3366  }
3367
3368  // Check if this klass has a vanilla default constructor
3369  if (super == NULL) {
3370    // java.lang.Object has empty default constructor
3371    k->set_has_vanilla_constructor();
3372  } else {
3373    if (Klass::cast(super)->has_vanilla_constructor() &&
3374        _has_vanilla_constructor) {
3375      k->set_has_vanilla_constructor();
3376    }
3377#ifdef ASSERT
3378    bool v = false;
3379    if (Klass::cast(super)->has_vanilla_constructor()) {
3380      methodOop constructor = k->find_method(vmSymbols::object_initializer_name(
3381), vmSymbols::void_method_signature());
3382      if (constructor != NULL && constructor->is_vanilla_constructor()) {
3383        v = true;
3384      }
3385    }
3386    assert(v == k->has_vanilla_constructor(), "inconsistent has_vanilla_constructor");
3387#endif
3388  }
3389
3390  // If it cannot be fast-path allocated, set a bit in the layout helper.
3391  // See documentation of instanceKlass::can_be_fastpath_allocated().
3392  assert(k->size_helper() > 0, "layout_helper is initialized");
3393  if ((!RegisterFinalizersAtInit && k->has_finalizer())
3394      || k->is_abstract() || k->is_interface()
3395      || (k->name() == vmSymbols::java_lang_Class()
3396          && k->class_loader() == NULL)
3397      || k->size_helper() >= FastAllocateSizeLimit) {
3398    // Forbid fast-path allocation.
3399    jint lh = Klass::instance_layout_helper(k->size_helper(), true);
3400    k->set_layout_helper(lh);
3401  }
3402}
3403
3404
3405// utility method for appending and array with check for duplicates
3406
3407void append_interfaces(objArrayHandle result, int& index, objArrayOop ifs) {
3408  // iterate over new interfaces
3409  for (int i = 0; i < ifs->length(); i++) {
3410    oop e = ifs->obj_at(i);
3411    assert(e->is_klass() && instanceKlass::cast(klassOop(e))->is_interface(), "just checking");
3412    // check for duplicates
3413    bool duplicate = false;
3414    for (int j = 0; j < index; j++) {
3415      if (result->obj_at(j) == e) {
3416        duplicate = true;
3417        break;
3418      }
3419    }
3420    // add new interface
3421    if (!duplicate) {
3422      result->obj_at_put(index++, e);
3423    }
3424  }
3425}
3426
3427objArrayHandle ClassFileParser::compute_transitive_interfaces(instanceKlassHandle super, objArrayHandle local_ifs, TRAPS) {
3428  // Compute maximum size for transitive interfaces
3429  int max_transitive_size = 0;
3430  int super_size = 0;
3431  // Add superclass transitive interfaces size
3432  if (super.not_null()) {
3433    super_size = super->transitive_interfaces()->length();
3434    max_transitive_size += super_size;
3435  }
3436  // Add local interfaces' super interfaces
3437  int local_size = local_ifs->length();
3438  for (int i = 0; i < local_size; i++) {
3439    klassOop l = klassOop(local_ifs->obj_at(i));
3440    max_transitive_size += instanceKlass::cast(l)->transitive_interfaces()->length();
3441  }
3442  // Finally add local interfaces
3443  max_transitive_size += local_size;
3444  // Construct array
3445  objArrayHandle result;
3446  if (max_transitive_size == 0) {
3447    // no interfaces, use canonicalized array
3448    result = objArrayHandle(THREAD, Universe::the_empty_system_obj_array());
3449  } else if (max_transitive_size == super_size) {
3450    // no new local interfaces added, share superklass' transitive interface array
3451    result = objArrayHandle(THREAD, super->transitive_interfaces());
3452  } else if (max_transitive_size == local_size) {
3453    // only local interfaces added, share local interface array
3454    result = local_ifs;
3455  } else {
3456    objArrayHandle nullHandle;
3457    objArrayOop new_objarray = oopFactory::new_system_objArray(max_transitive_size, CHECK_(nullHandle));
3458    result = objArrayHandle(THREAD, new_objarray);
3459    int index = 0;
3460    // Copy down from superclass
3461    if (super.not_null()) {
3462      append_interfaces(result, index, super->transitive_interfaces());
3463    }
3464    // Copy down from local interfaces' superinterfaces
3465    for (int i = 0; i < local_ifs->length(); i++) {
3466      klassOop l = klassOop(local_ifs->obj_at(i));
3467      append_interfaces(result, index, instanceKlass::cast(l)->transitive_interfaces());
3468    }
3469    // Finally add local interfaces
3470    append_interfaces(result, index, local_ifs());
3471
3472    // Check if duplicates were removed
3473    if (index != max_transitive_size) {
3474      assert(index < max_transitive_size, "just checking");
3475      objArrayOop new_result = oopFactory::new_system_objArray(index, CHECK_(nullHandle));
3476      for (int i = 0; i < index; i++) {
3477        oop e = result->obj_at(i);
3478        assert(e != NULL, "just checking");
3479        new_result->obj_at_put(i, e);
3480      }
3481      result = objArrayHandle(THREAD, new_result);
3482    }
3483  }
3484  return result;
3485}
3486
3487
3488void ClassFileParser::check_super_class_access(instanceKlassHandle this_klass, TRAPS) {
3489  klassOop super = this_klass->super();
3490  if ((super != NULL) &&
3491      (!Reflection::verify_class_access(this_klass->as_klassOop(), super, false))) {
3492    ResourceMark rm(THREAD);
3493    Exceptions::fthrow(
3494      THREAD_AND_LOCATION,
3495      vmSymbolHandles::java_lang_IllegalAccessError(),
3496      "class %s cannot access its superclass %s",
3497      this_klass->external_name(),
3498      instanceKlass::cast(super)->external_name()
3499    );
3500    return;
3501  }
3502}
3503
3504
3505void ClassFileParser::check_super_interface_access(instanceKlassHandle this_klass, TRAPS) {
3506  objArrayHandle local_interfaces (THREAD, this_klass->local_interfaces());
3507  int lng = local_interfaces->length();
3508  for (int i = lng - 1; i >= 0; i--) {
3509    klassOop k = klassOop(local_interfaces->obj_at(i));
3510    assert (k != NULL && Klass::cast(k)->is_interface(), "invalid interface");
3511    if (!Reflection::verify_class_access(this_klass->as_klassOop(), k, false)) {
3512      ResourceMark rm(THREAD);
3513      Exceptions::fthrow(
3514        THREAD_AND_LOCATION,
3515        vmSymbolHandles::java_lang_IllegalAccessError(),
3516        "class %s cannot access its superinterface %s",
3517        this_klass->external_name(),
3518        instanceKlass::cast(k)->external_name()
3519      );
3520      return;
3521    }
3522  }
3523}
3524
3525
3526void ClassFileParser::check_final_method_override(instanceKlassHandle this_klass, TRAPS) {
3527  objArrayHandle methods (THREAD, this_klass->methods());
3528  int num_methods = methods->length();
3529
3530  // go thru each method and check if it overrides a final method
3531  for (int index = 0; index < num_methods; index++) {
3532    methodOop m = (methodOop)methods->obj_at(index);
3533
3534    // skip private, static and <init> methods
3535    if ((!m->is_private()) &&
3536        (!m->is_static()) &&
3537        (m->name() != vmSymbols::object_initializer_name())) {
3538
3539      symbolOop name = m->name();
3540      symbolOop signature = m->signature();
3541      klassOop k = this_klass->super();
3542      methodOop super_m = NULL;
3543      while (k != NULL) {
3544        // skip supers that don't have final methods.
3545        if (k->klass_part()->has_final_method()) {
3546          // lookup a matching method in the super class hierarchy
3547          super_m = instanceKlass::cast(k)->lookup_method(name, signature);
3548          if (super_m == NULL) {
3549            break; // didn't find any match; get out
3550          }
3551
3552          if (super_m->is_final() &&
3553              // matching method in super is final
3554              (Reflection::verify_field_access(this_klass->as_klassOop(),
3555                                               super_m->method_holder(),
3556                                               super_m->method_holder(),
3557                                               super_m->access_flags(), false))
3558            // this class can access super final method and therefore override
3559            ) {
3560            ResourceMark rm(THREAD);
3561            Exceptions::fthrow(
3562              THREAD_AND_LOCATION,
3563              vmSymbolHandles::java_lang_VerifyError(),
3564              "class %s overrides final method %s.%s",
3565              this_klass->external_name(),
3566              name->as_C_string(),
3567              signature->as_C_string()
3568            );
3569            return;
3570          }
3571
3572          // continue to look from super_m's holder's super.
3573          k = instanceKlass::cast(super_m->method_holder())->super();
3574          continue;
3575        }
3576
3577        k = k->klass_part()->super();
3578      }
3579    }
3580  }
3581}
3582
3583
3584// assumes that this_klass is an interface
3585void ClassFileParser::check_illegal_static_method(instanceKlassHandle this_klass, TRAPS) {
3586  assert(this_klass->is_interface(), "not an interface");
3587  objArrayHandle methods (THREAD, this_klass->methods());
3588  int num_methods = methods->length();
3589
3590  for (int index = 0; index < num_methods; index++) {
3591    methodOop m = (methodOop)methods->obj_at(index);
3592    // if m is static and not the init method, throw a verify error
3593    if ((m->is_static()) && (m->name() != vmSymbols::class_initializer_name())) {
3594      ResourceMark rm(THREAD);
3595      Exceptions::fthrow(
3596        THREAD_AND_LOCATION,
3597        vmSymbolHandles::java_lang_VerifyError(),
3598        "Illegal static method %s in interface %s",
3599        m->name()->as_C_string(),
3600        this_klass->external_name()
3601      );
3602      return;
3603    }
3604  }
3605}
3606
3607// utility methods for format checking
3608
3609void ClassFileParser::verify_legal_class_modifiers(jint flags, TRAPS) {
3610  if (!_need_verify) { return; }
3611
3612  const bool is_interface  = (flags & JVM_ACC_INTERFACE)  != 0;
3613  const bool is_abstract   = (flags & JVM_ACC_ABSTRACT)   != 0;
3614  const bool is_final      = (flags & JVM_ACC_FINAL)      != 0;
3615  const bool is_super      = (flags & JVM_ACC_SUPER)      != 0;
3616  const bool is_enum       = (flags & JVM_ACC_ENUM)       != 0;
3617  const bool is_annotation = (flags & JVM_ACC_ANNOTATION) != 0;
3618  const bool major_gte_15  = _major_version >= JAVA_1_5_VERSION;
3619
3620  if ((is_abstract && is_final) ||
3621      (is_interface && !is_abstract) ||
3622      (is_interface && major_gte_15 && (is_super || is_enum)) ||
3623      (!is_interface && major_gte_15 && is_annotation)) {
3624    ResourceMark rm(THREAD);
3625    Exceptions::fthrow(
3626      THREAD_AND_LOCATION,
3627      vmSymbolHandles::java_lang_ClassFormatError(),
3628      "Illegal class modifiers in class %s: 0x%X",
3629      _class_name->as_C_string(), flags
3630    );
3631    return;
3632  }
3633}
3634
3635bool ClassFileParser::has_illegal_visibility(jint flags) {
3636  const bool is_public    = (flags & JVM_ACC_PUBLIC)    != 0;
3637  const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0;
3638  const bool is_private   = (flags & JVM_ACC_PRIVATE)   != 0;
3639
3640  return ((is_public && is_protected) ||
3641          (is_public && is_private) ||
3642          (is_protected && is_private));
3643}
3644
3645bool ClassFileParser::is_supported_version(u2 major, u2 minor) {
3646  u2 max_version = JDK_Version::is_gte_jdk17x_version() ?
3647    JAVA_MAX_SUPPORTED_VERSION : JAVA_6_VERSION;
3648  return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
3649         (major <= max_version) &&
3650         ((major != max_version) ||
3651          (minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
3652}
3653
3654void ClassFileParser::verify_legal_field_modifiers(
3655    jint flags, bool is_interface, TRAPS) {
3656  if (!_need_verify) { return; }
3657
3658  const bool is_public    = (flags & JVM_ACC_PUBLIC)    != 0;
3659  const bool is_protected = (flags & JVM_ACC_PROTECTED) != 0;
3660  const bool is_private   = (flags & JVM_ACC_PRIVATE)   != 0;
3661  const bool is_static    = (flags & JVM_ACC_STATIC)    != 0;
3662  const bool is_final     = (flags & JVM_ACC_FINAL)     != 0;
3663  const bool is_volatile  = (flags & JVM_ACC_VOLATILE)  != 0;
3664  const bool is_transient = (flags & JVM_ACC_TRANSIENT) != 0;
3665  const bool is_enum      = (flags & JVM_ACC_ENUM)      != 0;
3666  const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION;
3667
3668  bool is_illegal = false;
3669
3670  if (is_interface) {
3671    if (!is_public || !is_static || !is_final || is_private ||
3672        is_protected || is_volatile || is_transient ||
3673        (major_gte_15 && is_enum)) {
3674      is_illegal = true;
3675    }
3676  } else { // not interface
3677    if (has_illegal_visibility(flags) || (is_final && is_volatile)) {
3678      is_illegal = true;
3679    }
3680  }
3681
3682  if (is_illegal) {
3683    ResourceMark rm(THREAD);
3684    Exceptions::fthrow(
3685      THREAD_AND_LOCATION,
3686      vmSymbolHandles::java_lang_ClassFormatError(),
3687      "Illegal field modifiers in class %s: 0x%X",
3688      _class_name->as_C_string(), flags);
3689    return;
3690  }
3691}
3692
3693void ClassFileParser::verify_legal_method_modifiers(
3694    jint flags, bool is_interface, symbolHandle name, TRAPS) {
3695  if (!_need_verify) { return; }
3696
3697  const bool is_public       = (flags & JVM_ACC_PUBLIC)       != 0;
3698  const bool is_private      = (flags & JVM_ACC_PRIVATE)      != 0;
3699  const bool is_static       = (flags & JVM_ACC_STATIC)       != 0;
3700  const bool is_final        = (flags & JVM_ACC_FINAL)        != 0;
3701  const bool is_native       = (flags & JVM_ACC_NATIVE)       != 0;
3702  const bool is_abstract     = (flags & JVM_ACC_ABSTRACT)     != 0;
3703  const bool is_bridge       = (flags & JVM_ACC_BRIDGE)       != 0;
3704  const bool is_strict       = (flags & JVM_ACC_STRICT)       != 0;
3705  const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0;
3706  const bool major_gte_15    = _major_version >= JAVA_1_5_VERSION;
3707  const bool is_initializer  = (name == vmSymbols::object_initializer_name());
3708
3709  bool is_illegal = false;
3710
3711  if (is_interface) {
3712    if (!is_abstract || !is_public || is_static || is_final ||
3713        is_native || (major_gte_15 && (is_synchronized || is_strict))) {
3714      is_illegal = true;
3715    }
3716  } else { // not interface
3717    if (is_initializer) {
3718      if (is_static || is_final || is_synchronized || is_native ||
3719          is_abstract || (major_gte_15 && is_bridge)) {
3720        is_illegal = true;
3721      }
3722    } else { // not initializer
3723      if (is_abstract) {
3724        if ((is_final || is_native || is_private || is_static ||
3725            (major_gte_15 && (is_synchronized || is_strict)))) {
3726          is_illegal = true;
3727        }
3728      }
3729      if (has_illegal_visibility(flags)) {
3730        is_illegal = true;
3731      }
3732    }
3733  }
3734
3735  if (is_illegal) {
3736    ResourceMark rm(THREAD);
3737    Exceptions::fthrow(
3738      THREAD_AND_LOCATION,
3739      vmSymbolHandles::java_lang_ClassFormatError(),
3740      "Method %s in class %s has illegal modifiers: 0x%X",
3741      name->as_C_string(), _class_name->as_C_string(), flags);
3742    return;
3743  }
3744}
3745
3746void ClassFileParser::verify_legal_utf8(const unsigned char* buffer, int length, TRAPS) {
3747  assert(_need_verify, "only called when _need_verify is true");
3748  int i = 0;
3749  int count = length >> 2;
3750  for (int k=0; k<count; k++) {
3751    unsigned char b0 = buffer[i];
3752    unsigned char b1 = buffer[i+1];
3753    unsigned char b2 = buffer[i+2];
3754    unsigned char b3 = buffer[i+3];
3755    // For an unsigned char v,
3756    // (v | v - 1) is < 128 (highest bit 0) for 0 < v < 128;
3757    // (v | v - 1) is >= 128 (highest bit 1) for v == 0 or v >= 128.
3758    unsigned char res = b0 | b0 - 1 |
3759                        b1 | b1 - 1 |
3760                        b2 | b2 - 1 |
3761                        b3 | b3 - 1;
3762    if (res >= 128) break;
3763    i += 4;
3764  }
3765  for(; i < length; i++) {
3766    unsigned short c;
3767    // no embedded zeros
3768    guarantee_property((buffer[i] != 0), "Illegal UTF8 string in constant pool in class file %s", CHECK);
3769    if(buffer[i] < 128) {
3770      continue;
3771    }
3772    if ((i + 5) < length) { // see if it's legal supplementary character
3773      if (UTF8::is_supplementary_character(&buffer[i])) {
3774        c = UTF8::get_supplementary_character(&buffer[i]);
3775        i += 5;
3776        continue;
3777      }
3778    }
3779    switch (buffer[i] >> 4) {
3780      default: break;
3781      case 0x8: case 0x9: case 0xA: case 0xB: case 0xF:
3782        classfile_parse_error("Illegal UTF8 string in constant pool in class file %s", CHECK);
3783      case 0xC: case 0xD:  // 110xxxxx  10xxxxxx
3784        c = (buffer[i] & 0x1F) << 6;
3785        i++;
3786        if ((i < length) && ((buffer[i] & 0xC0) == 0x80)) {
3787          c += buffer[i] & 0x3F;
3788          if (_major_version <= 47 || c == 0 || c >= 0x80) {
3789            // for classes with major > 47, c must a null or a character in its shortest form
3790            break;
3791          }
3792        }
3793        classfile_parse_error("Illegal UTF8 string in constant pool in class file %s", CHECK);
3794      case 0xE:  // 1110xxxx 10xxxxxx 10xxxxxx
3795        c = (buffer[i] & 0xF) << 12;
3796        i += 2;
3797        if ((i < length) && ((buffer[i-1] & 0xC0) == 0x80) && ((buffer[i] & 0xC0) == 0x80)) {
3798          c += ((buffer[i-1] & 0x3F) << 6) + (buffer[i] & 0x3F);
3799          if (_major_version <= 47 || c >= 0x800) {
3800            // for classes with major > 47, c must be in its shortest form
3801            break;
3802          }
3803        }
3804        classfile_parse_error("Illegal UTF8 string in constant pool in class file %s", CHECK);
3805    }  // end of switch
3806  } // end of for
3807}
3808
3809// Checks if name is a legal class name.
3810void ClassFileParser::verify_legal_class_name(symbolHandle name, TRAPS) {
3811  if (!_need_verify || _relax_verify) { return; }
3812
3813  char buf[fixed_buffer_size];
3814  char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size);
3815  unsigned int length = name->utf8_length();
3816  bool legal = false;
3817
3818  if (length > 0) {
3819    char* p;
3820    if (bytes[0] == JVM_SIGNATURE_ARRAY) {
3821      p = skip_over_field_signature(bytes, false, length, CHECK);
3822      legal = (p != NULL) && ((p - bytes) == (int)length);
3823    } else if (_major_version < JAVA_1_5_VERSION) {
3824      if (bytes[0] != '<') {
3825        p = skip_over_field_name(bytes, true, length);
3826        legal = (p != NULL) && ((p - bytes) == (int)length);
3827      }
3828    } else {
3829      // 4900761: relax the constraints based on JSR202 spec
3830      // Class names may be drawn from the entire Unicode character set.
3831      // Identifiers between '/' must be unqualified names.
3832      // The utf8 string has been verified when parsing cpool entries.
3833      legal = verify_unqualified_name(bytes, length, LegalClass);
3834    }
3835  }
3836  if (!legal) {
3837    ResourceMark rm(THREAD);
3838    Exceptions::fthrow(
3839      THREAD_AND_LOCATION,
3840      vmSymbolHandles::java_lang_ClassFormatError(),
3841      "Illegal class name \"%s\" in class file %s", bytes,
3842      _class_name->as_C_string()
3843    );
3844    return;
3845  }
3846}
3847
3848// Checks if name is a legal field name.
3849void ClassFileParser::verify_legal_field_name(symbolHandle name, TRAPS) {
3850  if (!_need_verify || _relax_verify) { return; }
3851
3852  char buf[fixed_buffer_size];
3853  char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size);
3854  unsigned int length = name->utf8_length();
3855  bool legal = false;
3856
3857  if (length > 0) {
3858    if (_major_version < JAVA_1_5_VERSION) {
3859      if (bytes[0] != '<') {
3860        char* p = skip_over_field_name(bytes, false, length);
3861        legal = (p != NULL) && ((p - bytes) == (int)length);
3862      }
3863    } else {
3864      // 4881221: relax the constraints based on JSR202 spec
3865      legal = verify_unqualified_name(bytes, length, LegalField);
3866    }
3867  }
3868
3869  if (!legal) {
3870    ResourceMark rm(THREAD);
3871    Exceptions::fthrow(
3872      THREAD_AND_LOCATION,
3873      vmSymbolHandles::java_lang_ClassFormatError(),
3874      "Illegal field name \"%s\" in class %s", bytes,
3875      _class_name->as_C_string()
3876    );
3877    return;
3878  }
3879}
3880
3881// Checks if name is a legal method name.
3882void ClassFileParser::verify_legal_method_name(symbolHandle name, TRAPS) {
3883  if (!_need_verify || _relax_verify) { return; }
3884
3885  assert(!name.is_null(), "method name is null");
3886  char buf[fixed_buffer_size];
3887  char* bytes = name->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size);
3888  unsigned int length = name->utf8_length();
3889  bool legal = false;
3890
3891  if (length > 0) {
3892    if (bytes[0] == '<') {
3893      if (name == vmSymbols::object_initializer_name() || name == vmSymbols::class_initializer_name()) {
3894        legal = true;
3895      }
3896    } else if (_major_version < JAVA_1_5_VERSION) {
3897      char* p;
3898      p = skip_over_field_name(bytes, false, length);
3899      legal = (p != NULL) && ((p - bytes) == (int)length);
3900    } else {
3901      // 4881221: relax the constraints based on JSR202 spec
3902      legal = verify_unqualified_name(bytes, length, LegalMethod);
3903    }
3904  }
3905
3906  if (!legal) {
3907    ResourceMark rm(THREAD);
3908    Exceptions::fthrow(
3909      THREAD_AND_LOCATION,
3910      vmSymbolHandles::java_lang_ClassFormatError(),
3911      "Illegal method name \"%s\" in class %s", bytes,
3912      _class_name->as_C_string()
3913    );
3914    return;
3915  }
3916}
3917
3918
3919// Checks if signature is a legal field signature.
3920void ClassFileParser::verify_legal_field_signature(symbolHandle name, symbolHandle signature, TRAPS) {
3921  if (!_need_verify) { return; }
3922
3923  char buf[fixed_buffer_size];
3924  char* bytes = signature->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size);
3925  unsigned int length = signature->utf8_length();
3926  char* p = skip_over_field_signature(bytes, false, length, CHECK);
3927
3928  if (p == NULL || (p - bytes) != (int)length) {
3929    ResourceMark rm(THREAD);
3930    Exceptions::fthrow(
3931      THREAD_AND_LOCATION,
3932      vmSymbolHandles::java_lang_ClassFormatError(),
3933      "Field \"%s\" in class %s has illegal signature \"%s\"",
3934      name->as_C_string(), _class_name->as_C_string(), bytes
3935    );
3936    return;
3937  }
3938}
3939
3940// Checks if signature is a legal method signature.
3941// Returns number of parameters
3942int ClassFileParser::verify_legal_method_signature(symbolHandle name, symbolHandle signature, TRAPS) {
3943  if (!_need_verify) {
3944    // make sure caller's args_size will be less than 0 even for non-static
3945    // method so it will be recomputed in compute_size_of_parameters().
3946    return -2;
3947  }
3948
3949  unsigned int args_size = 0;
3950  char buf[fixed_buffer_size];
3951  char* p = signature->as_utf8_flexible_buffer(THREAD, buf, fixed_buffer_size);
3952  unsigned int length = signature->utf8_length();
3953  char* nextp;
3954
3955  // The first character must be a '('
3956  if ((length > 0) && (*p++ == JVM_SIGNATURE_FUNC)) {
3957    length--;
3958    // Skip over legal field signatures
3959    nextp = skip_over_field_signature(p, false, length, CHECK_0);
3960    while ((length > 0) && (nextp != NULL)) {
3961      args_size++;
3962      if (p[0] == 'J' || p[0] == 'D') {
3963        args_size++;
3964      }
3965      length -= nextp - p;
3966      p = nextp;
3967      nextp = skip_over_field_signature(p, false, length, CHECK_0);
3968    }
3969    // The first non-signature thing better be a ')'
3970    if ((length > 0) && (*p++ == JVM_SIGNATURE_ENDFUNC)) {
3971      length--;
3972      if (name->utf8_length() > 0 && name->byte_at(0) == '<') {
3973        // All internal methods must return void
3974        if ((length == 1) && (p[0] == JVM_SIGNATURE_VOID)) {
3975          return args_size;
3976        }
3977      } else {
3978        // Now we better just have a return value
3979        nextp = skip_over_field_signature(p, true, length, CHECK_0);
3980        if (nextp && ((int)length == (nextp - p))) {
3981          return args_size;
3982        }
3983      }
3984    }
3985  }
3986  // Report error
3987  ResourceMark rm(THREAD);
3988  Exceptions::fthrow(
3989    THREAD_AND_LOCATION,
3990    vmSymbolHandles::java_lang_ClassFormatError(),
3991    "Method \"%s\" in class %s has illegal signature \"%s\"",
3992    name->as_C_string(),  _class_name->as_C_string(), p
3993  );
3994  return 0;
3995}
3996
3997
3998// Unqualified names may not contain the characters '.', ';', or '/'.
3999// Method names also may not contain the characters '<' or '>', unless <init> or <clinit>.
4000// Note that method names may not be <init> or <clinit> in this method.
4001// Because these names have been checked as special cases before calling this method
4002// in verify_legal_method_name.
4003bool ClassFileParser::verify_unqualified_name(char* name, unsigned int length, int type) {
4004  jchar ch;
4005
4006  for (char* p = name; p != name + length; ) {
4007    ch = *p;
4008    if (ch < 128) {
4009      p++;
4010      if (ch == '.' || ch == ';') {
4011        return false;   // do not permit '.' or ';'
4012      }
4013      if (type != LegalClass && ch == '/') {
4014        return false;   // do not permit '/' unless it's class name
4015      }
4016      if (type == LegalMethod && (ch == '<' || ch == '>')) {
4017        return false;   // do not permit '<' or '>' in method names
4018      }
4019    } else {
4020      char* tmp_p = UTF8::next(p, &ch);
4021      p = tmp_p;
4022    }
4023  }
4024  return true;
4025}
4026
4027
4028// Take pointer to a string. Skip over the longest part of the string that could
4029// be taken as a fieldname. Allow '/' if slash_ok is true.
4030// Return a pointer to just past the fieldname.
4031// Return NULL if no fieldname at all was found, or in the case of slash_ok
4032// being true, we saw consecutive slashes (meaning we were looking for a
4033// qualified path but found something that was badly-formed).
4034char* ClassFileParser::skip_over_field_name(char* name, bool slash_ok, unsigned int length) {
4035  char* p;
4036  jchar ch;
4037  jboolean last_is_slash = false;
4038  jboolean not_first_ch = false;
4039
4040  for (p = name; p != name + length; not_first_ch = true) {
4041    char* old_p = p;
4042    ch = *p;
4043    if (ch < 128) {
4044      p++;
4045      // quick check for ascii
4046      if ((ch >= 'a' && ch <= 'z') ||
4047          (ch >= 'A' && ch <= 'Z') ||
4048          (ch == '_' || ch == '$') ||
4049          (not_first_ch && ch >= '0' && ch <= '9')) {
4050        last_is_slash = false;
4051        continue;
4052      }
4053      if (slash_ok && ch == '/') {
4054        if (last_is_slash) {
4055          return NULL;  // Don't permit consecutive slashes
4056        }
4057        last_is_slash = true;
4058        continue;
4059      }
4060    } else {
4061      jint unicode_ch;
4062      char* tmp_p = UTF8::next_character(p, &unicode_ch);
4063      p = tmp_p;
4064      last_is_slash = false;
4065      // Check if ch is Java identifier start or is Java identifier part
4066      // 4672820: call java.lang.Character methods directly without generating separate tables.
4067      EXCEPTION_MARK;
4068      instanceKlassHandle klass (THREAD, SystemDictionary::char_klass());
4069
4070      // return value
4071      JavaValue result(T_BOOLEAN);
4072      // Set up the arguments to isJavaIdentifierStart and isJavaIdentifierPart
4073      JavaCallArguments args;
4074      args.push_int(unicode_ch);
4075
4076      // public static boolean isJavaIdentifierStart(char ch);
4077      JavaCalls::call_static(&result,
4078                             klass,
4079                             vmSymbolHandles::isJavaIdentifierStart_name(),
4080                             vmSymbolHandles::int_bool_signature(),
4081                             &args,
4082                             THREAD);
4083
4084      if (HAS_PENDING_EXCEPTION) {
4085        CLEAR_PENDING_EXCEPTION;
4086        return 0;
4087      }
4088      if (result.get_jboolean()) {
4089        continue;
4090      }
4091
4092      if (not_first_ch) {
4093        // public static boolean isJavaIdentifierPart(char ch);
4094        JavaCalls::call_static(&result,
4095                               klass,
4096                               vmSymbolHandles::isJavaIdentifierPart_name(),
4097                               vmSymbolHandles::int_bool_signature(),
4098                               &args,
4099                               THREAD);
4100
4101        if (HAS_PENDING_EXCEPTION) {
4102          CLEAR_PENDING_EXCEPTION;
4103          return 0;
4104        }
4105
4106        if (result.get_jboolean()) {
4107          continue;
4108        }
4109      }
4110    }
4111    return (not_first_ch) ? old_p : NULL;
4112  }
4113  return (not_first_ch) ? p : NULL;
4114}
4115
4116
4117// Take pointer to a string. Skip over the longest part of the string that could
4118// be taken as a field signature. Allow "void" if void_ok.
4119// Return a pointer to just past the signature.
4120// Return NULL if no legal signature is found.
4121char* ClassFileParser::skip_over_field_signature(char* signature,
4122                                                 bool void_ok,
4123                                                 unsigned int length,
4124                                                 TRAPS) {
4125  unsigned int array_dim = 0;
4126  while (length > 0) {
4127    switch (signature[0]) {
4128      case JVM_SIGNATURE_VOID: if (!void_ok) { return NULL; }
4129      case JVM_SIGNATURE_BOOLEAN:
4130      case JVM_SIGNATURE_BYTE:
4131      case JVM_SIGNATURE_CHAR:
4132      case JVM_SIGNATURE_SHORT:
4133      case JVM_SIGNATURE_INT:
4134      case JVM_SIGNATURE_FLOAT:
4135      case JVM_SIGNATURE_LONG:
4136      case JVM_SIGNATURE_DOUBLE:
4137        return signature + 1;
4138      case JVM_SIGNATURE_CLASS: {
4139        if (_major_version < JAVA_1_5_VERSION) {
4140          // Skip over the class name if one is there
4141          char* p = skip_over_field_name(signature + 1, true, --length);
4142
4143          // The next character better be a semicolon
4144          if (p && (p - signature) > 1 && p[0] == ';') {
4145            return p + 1;
4146          }
4147        } else {
4148          // 4900761: For class version > 48, any unicode is allowed in class name.
4149          length--;
4150          signature++;
4151          while (length > 0 && signature[0] != ';') {
4152            if (signature[0] == '.') {
4153              classfile_parse_error("Class name contains illegal character '.' in descriptor in class file %s", CHECK_0);
4154            }
4155            length--;
4156            signature++;
4157          }
4158          if (signature[0] == ';') { return signature + 1; }
4159        }
4160
4161        return NULL;
4162      }
4163      case JVM_SIGNATURE_ARRAY:
4164        array_dim++;
4165        if (array_dim > 255) {
4166          // 4277370: array descriptor is valid only if it represents 255 or fewer dimensions.
4167          classfile_parse_error("Array type descriptor has more than 255 dimensions in class file %s", CHECK_0);
4168        }
4169        // The rest of what's there better be a legal signature
4170        signature++;
4171        length--;
4172        void_ok = false;
4173        break;
4174
4175      default:
4176        return NULL;
4177    }
4178  }
4179  return NULL;
4180}
4181