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