< prev index next >

src/hotspot/share/classfile/classFileParser.cpp

Print this page
*** 510,10 ***
--- 510,21 ---
          Symbol* const name = cp->symbol_at(class_index);
          const unsigned int name_len = name->utf8_length();
          if (name->is_Q_signature()) {
            cp->unresolved_qdescriptor_at_put(index, class_index, num_klasses++);
          } else {
+           if (name->is_L_signature()) {
+             check_property(_lenvelope_mode == lenvelope_unknown_mode || AllowLEnvelopesInCCI,
+                 "[L-envelope forbidden mode] Illegal use of L-envelope in CONSTANT_Class_info index %u in class file %s",
+                 class_index, CHECK);
+             _lenvelope_mode = lenvelope_required_mode;
+           } else {
+             check_property(_lenvelope_mode == lenvelope_unknown_mode || _lenvelope_mode == lenvelope_forbidden_mode,
+                 "[L-envelope required mode] Missing L-envelope in CONSTANT_Class_info index %u in class file %s",
+                 class_index, CHECK);
+             _lenvelope_mode = lenvelope_forbidden_mode;
+           }
            cp->unresolved_klass_at_put(index, class_index, num_klasses++);
          }
          break;
        }
        case JVM_CONSTANT_StringIndex: {

*** 6339,15 ***
  
  void ClassFileParser::update_class_name(Symbol* new_class_name) {
    // Decrement the refcount in the old name, since we're clobbering it.
    _class_name->decrement_refcount();
  
!   _class_name = new_class_name;
!   // Increment the refcount of the new name.
!   // Now the ClassFileParser owns this name and will decrement in
!   // the destructor.
!   _class_name->increment_refcount();
  }
  
  
  // For an unsafe anonymous class that is in the unnamed package, move it to its host class's
  // package by prepending its host class's package name to its class name and setting
--- 6350,20 ---
  
  void ClassFileParser::update_class_name(Symbol* new_class_name) {
    // Decrement the refcount in the old name, since we're clobbering it.
    _class_name->decrement_refcount();
  
!   if (new_class_name->is_L_signature() || new_class_name->is_Q_signature()) {
!     new_class_name = new_class_name->fundamental_name(Thread::current());
!     _class_name = new_class_name;
!   } else {
!     _class_name = new_class_name;
+     // Increment the refcount of the new name.
+     // Now the ClassFileParser owns this name and will decrement in
+     // the destructor.
+     _class_name->increment_refcount();
+   }
  }
  
  
  // For an unsafe anonymous class that is in the unnamed package, move it to its host class's
  // package by prepending its host class's package name to its class name and setting

*** 6481,11 ***
    _is_naturally_atomic(false),
    _is_declared_atomic(false),
    _has_finalizer(false),
    _has_empty_finalizer(false),
    _has_vanilla_constructor(false),
!   _max_bootstrap_specifier_index(-1) {
  
    _class_name = name != NULL ? name : vmSymbols::unknown_class_name();
    _class_name->increment_refcount();
  
    assert(THREAD->is_Java_thread(), "invariant");
--- 6497,12 ---
    _is_naturally_atomic(false),
    _is_declared_atomic(false),
    _has_finalizer(false),
    _has_empty_finalizer(false),
    _has_vanilla_constructor(false),
!   _max_bootstrap_specifier_index(-1),
+   _lenvelope_mode(lenvelope_unknown_mode) {
  
    _class_name = name != NULL ? name : vmSymbols::unknown_class_name();
    _class_name->increment_refcount();
  
    assert(THREAD->is_Java_thread(), "invariant");
< prev index next >