--- old/src/hotspot/share/classfile/verificationType.cpp 2020-01-24 19:17:44.430121010 +0000 +++ new/src/hotspot/share/classfile/verificationType.cpp 2020-01-24 19:17:43.636978173 +0000 @@ -120,27 +120,29 @@ VerificationType VerificationType::get_component(ClassVerifier *context, TRAPS) const { assert(is_array() && name()->utf8_length() >= 2, "Must be a valid array"); - Symbol* component; - switch (name()->char_at(1)) { - case JVM_SIGNATURE_BOOLEAN: return VerificationType(Boolean); - case JVM_SIGNATURE_BYTE: return VerificationType(Byte); - case JVM_SIGNATURE_CHAR: return VerificationType(Char); - case JVM_SIGNATURE_SHORT: return VerificationType(Short); - case JVM_SIGNATURE_INT: return VerificationType(Integer); - case JVM_SIGNATURE_LONG: return VerificationType(Long); - case JVM_SIGNATURE_FLOAT: return VerificationType(Float); - case JVM_SIGNATURE_DOUBLE: return VerificationType(Double); - case JVM_SIGNATURE_ARRAY: - component = context->create_temporary_symbol( - name(), 1, name()->utf8_length()); - return VerificationType::reference_type(component); - case JVM_SIGNATURE_CLASS: - component = context->create_temporary_symbol( - name(), 2, name()->utf8_length() - 1); - return VerificationType::reference_type(component); - default: - // Met an invalid type signature, e.g. [X - return VerificationType::bogus_type(); + SignatureStream ss(name(), false); + ss.skip_array_prefix(1); + switch (ss.type()) { + case T_BOOLEAN: return VerificationType(Boolean); + case T_BYTE: return VerificationType(Byte); + case T_CHAR: return VerificationType(Char); + case T_SHORT: return VerificationType(Short); + case T_INT: return VerificationType(Integer); + case T_LONG: return VerificationType(Long); + case T_FLOAT: return VerificationType(Float); + case T_DOUBLE: return VerificationType(Double); + case T_ARRAY: + case T_OBJECT: { + guarantee(ss.is_reference(), "unchecked verifier input?"); + Symbol* component = ss.as_symbol(); + // Create another symbol to save as signature stream unreferences this symbol. + Symbol* component_copy = context->create_temporary_symbol(component); + assert(component_copy == component, "symbols don't match"); + return VerificationType::reference_type(component_copy); + } + default: + // Met an invalid type signature, e.g. [X + return VerificationType::bogus_type(); } }