--- old/src/hotspot/share/oops/constantPool.cpp 2019-03-27 16:10:36.619140593 +0100 +++ new/src/hotspot/share/oops/constantPool.cpp 2019-03-27 16:10:36.319135629 +0100 @@ -235,7 +235,7 @@ // The interpreter assumes when the tag is stored, the klass is resolved // and the Klass* non-NULL, so we need hardware store ordering here. - jbyte qdesc_bit = name->is_Q_signature() ? (jbyte)JVM_CONSTANT_QDESC_BIT : 0; + jbyte qdesc_bit = (name->is_Q_signature() || name->is_Q_array_signature()) ? (jbyte)JVM_CONSTANT_QDESC_BIT : 0; if (k != NULL) { release_tag_at_put(class_index, JVM_CONSTANT_Class | qdesc_bit); } else { @@ -253,6 +253,7 @@ // The interpreter assumes when the tag is stored, the klass is resolved // and the Klass* non-NULL, so we need hardware store ordering here. + assert(!(k->name()->is_Q_signature() || k->name()->is_Q_array_signature()), "Q-type without JVM_CONSTANT_QDESC_BIT"); release_tag_at_put(class_index, JVM_CONSTANT_Class); } @@ -1987,6 +1988,12 @@ ent_size = 2; break; } + case (JVM_CONSTANT_Class | JVM_CONSTANT_QDESC_BIT): { + idx1 = Bytes::get_Java_u2(bytes); + printf("qclass #%03d", idx1); + ent_size = 2; + break; + } case JVM_CONSTANT_String: { idx1 = Bytes::get_Java_u2(bytes); printf("String #%03d", idx1); @@ -2029,6 +2036,10 @@ printf("UnresolvedClass: %s", WARN_MSG); break; } + case (JVM_CONSTANT_UnresolvedClass | JVM_CONSTANT_QDESC_BIT): { + printf("UnresolvedQClass: %s", WARN_MSG); + break; + } case JVM_CONSTANT_UnresolvedClassInError: { printf("UnresolvedClassInErr: %s", WARN_MSG); break; @@ -2200,6 +2211,7 @@ case JVM_CONSTANT_Class: case JVM_CONSTANT_UnresolvedClass: case JVM_CONSTANT_UnresolvedClassInError: { + assert(!tag_at(idx).is_Qdescriptor_klass(), "Failed to encode QDesc"); *bytes = JVM_CONSTANT_Class; Symbol* sym = klass_name_at(idx); idx1 = tbl->symbol_to_value(sym);