# HG changeset patch # User lfoltan # Date 1571677996 14400 # Node ID cba8afa5cfed370c854581f8e186e47bcab57398 # Parent ae0af9fb3dbbf4c23fb3c72751fade92a07e11d2 8231844: Enhance type signature characters in classfile_constants.h and improve the JVM to use type signature characters more consistently Summary: Increase the use of type signature constants instead of hard coded characters within the JVM. Reviewed-by: coleenp, dholmes, fparain Contributed-by: lois.foltan@oracle.com, john.r.rose@oracle.com diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/aot/aotCodeHeap.cpp --- a/src/hotspot/share/aot/aotCodeHeap.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/aot/aotCodeHeap.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -93,7 +93,7 @@ Handle protection_domain(thread, caller->method_holder()->protection_domain()); // Ignore wrapping L and ; - if (name[0] == 'L') { + if (name[0] == JVM_SIGNATURE_CLASS) { assert(len > 2, "small name %s", name); name++; len -= 2; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/c1/c1_InstructionPrinter.cpp --- a/src/hotspot/share/c1/c1_InstructionPrinter.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/c1/c1_InstructionPrinter.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,19 +33,11 @@ #ifndef PRODUCT const char* InstructionPrinter::basic_type_name(BasicType type) { - switch (type) { - case T_BOOLEAN: return "boolean"; - case T_BYTE : return "byte"; - case T_CHAR : return "char"; - case T_SHORT : return "short"; - case T_INT : return "int"; - case T_LONG : return "long"; - case T_FLOAT : return "float"; - case T_DOUBLE : return "double"; - case T_ARRAY : return "array"; - case T_OBJECT : return "object"; - default : return "???"; + const char* n = type2name(type); + if (n == NULL || type > T_VOID) { + return "???"; } + return n; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/ci/ciEnv.cpp --- a/src/hotspot/share/ci/ciEnv.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/ci/ciEnv.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -413,8 +413,8 @@ // Now we need to check the SystemDictionary Symbol* sym = name->get_symbol(); - if (sym->char_at(0) == 'L' && - sym->char_at(sym->utf8_length()-1) == ';') { + if (sym->char_at(0) == JVM_SIGNATURE_CLASS && + sym->char_at(sym->utf8_length()-1) == JVM_SIGNATURE_ENDCLASS) { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, @@ -440,7 +440,7 @@ // setup up the proper type to return on OOM ciKlass* fail_type; - if (sym->char_at(0) == '[') { + if (sym->char_at(0) == JVM_SIGNATURE_ARRAY) { fail_type = _unloaded_ciobjarrayklass; } else { fail_type = _unloaded_ciinstance_klass; @@ -466,8 +466,8 @@ // we must build an array type around it. The CI requires array klasses // to be loaded if their element klasses are loaded, except when memory // is exhausted. - if (sym->char_at(0) == '[' && - (sym->char_at(1) == '[' || sym->char_at(1) == 'L')) { + if (sym->char_at(0) == JVM_SIGNATURE_ARRAY && + (sym->char_at(1) == JVM_SIGNATURE_ARRAY || sym->char_at(1) == JVM_SIGNATURE_CLASS)) { // We have an unloaded array. // Build it on the fly if the element class exists. TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/ci/ciInstanceKlass.cpp --- a/src/hotspot/share/ci/ciInstanceKlass.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -116,7 +116,7 @@ jobject loader, jobject protection_domain) : ciKlass(name, T_OBJECT) { - assert(name->char_at(0) != '[', "not an instance klass"); + assert(name->char_at(0) != JVM_SIGNATURE_ARRAY, "not an instance klass"); _init_state = (InstanceKlass::ClassState)0; _nonstatic_field_size = -1; _has_nonstatic_fields = false; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/ci/ciObjArrayKlass.cpp --- a/src/hotspot/share/ci/ciObjArrayKlass.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/ci/ciObjArrayKlass.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,16 +112,16 @@ Symbol* base_name_sym = element_name->get_symbol(); char* name; - if (base_name_sym->char_at(0) == '[' || - (base_name_sym->char_at(0) == 'L' && // watch package name 'Lxx' - base_name_sym->char_at(element_len-1) == ';')) { + if (base_name_sym->char_at(0) == JVM_SIGNATURE_ARRAY || + (base_name_sym->char_at(0) == JVM_SIGNATURE_CLASS && // watch package name 'Lxx' + base_name_sym->char_at(element_len-1) == JVM_SIGNATURE_ENDCLASS)) { int new_len = element_len + dimension + 1; // for the ['s and '\0' name = CURRENT_THREAD_ENV->name_buffer(new_len); int pos = 0; for ( ; pos < dimension; pos++) { - name[pos] = '['; + name[pos] = JVM_SIGNATURE_ARRAY; } strncpy(name+pos, (char*)element_name->base(), element_len); name[new_len-1] = '\0'; @@ -133,11 +133,11 @@ name = CURRENT_THREAD_ENV->name_buffer(new_len); int pos = 0; for ( ; pos < dimension; pos++) { - name[pos] = '['; + name[pos] = JVM_SIGNATURE_ARRAY; } - name[pos++] = 'L'; + name[pos++] = JVM_SIGNATURE_CLASS; strncpy(name+pos, (char*)element_name->base(), element_len); - name[new_len-2] = ';'; + name[new_len-2] = JVM_SIGNATURE_ENDCLASS; name[new_len-1] = '\0'; } return ciSymbol::make(name); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/ci/ciObjectFactory.cpp --- a/src/hotspot/share/ci/ciObjectFactory.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/ci/ciObjectFactory.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -486,7 +486,7 @@ // Two cases: this is an unloaded ObjArrayKlass or an // unloaded InstanceKlass. Deal with both. - if (name->char_at(0) == '[') { + if (name->char_at(0) == JVM_SIGNATURE_ARRAY) { // Decompose the name.' FieldArrayInfo fd; BasicType element_type = FieldType::get_array_info(name->get_symbol(), diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/ci/ciReplay.cpp --- a/src/hotspot/share/ci/ciReplay.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/ci/ciReplay.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -814,18 +814,18 @@ } oop java_mirror = k->java_mirror(); - if (field_signature[0] == '[') { + if (field_signature[0] == JVM_SIGNATURE_ARRAY) { int length = parse_int("array length"); oop value = NULL; - if (field_signature[1] == '[') { + if (field_signature[1] == JVM_SIGNATURE_ARRAY) { // multi dimensional array ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK); if (kelem == NULL) { return; } int rank = 0; - while (field_signature[rank] == '[') { + while (field_signature[rank] == JVM_SIGNATURE_ARRAY) { rank++; } jint* dims = NEW_RESOURCE_ARRAY(jint, rank); @@ -851,7 +851,8 @@ value = oopFactory::new_intArray(length, CHECK); } else if (strcmp(field_signature, "[J") == 0) { value = oopFactory::new_longArray(length, CHECK); - } else if (field_signature[0] == '[' && field_signature[1] == 'L') { + } else if (field_signature[0] == JVM_SIGNATURE_ARRAY && + field_signature[1] == JVM_SIGNATURE_CLASS) { Klass* kelem = resolve_klass(field_signature + 1, CHECK); value = oopFactory::new_objArray(kelem, length, CHECK); } else { @@ -892,7 +893,7 @@ } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) { Handle value = java_lang_String::create_from_str(string_value, CHECK); java_mirror->obj_field_put(fd.offset(), value()); - } else if (field_signature[0] == 'L') { + } else if (field_signature[0] == JVM_SIGNATURE_CLASS) { Klass* k = resolve_klass(string_value, CHECK); oop value = InstanceKlass::cast(k)->allocate_instance(CHECK); java_mirror->obj_field_put(fd.offset(), value); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/classFileParser.cpp --- a/src/hotspot/share/classfile/classFileParser.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/classFileParser.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -731,7 +731,7 @@ const unsigned int name_len = name->utf8_length(); if (tag == JVM_CONSTANT_Methodref && name_len != 0 && - name->char_at(0) == '<' && + name->char_at(0) == JVM_SIGNATURE_SPECIAL && name != vmSymbols::object_initializer_name()) { classfile_parse_error( "Bad method name at constant pool index %u in class file %s", @@ -4961,24 +4961,25 @@ if (length == 0) return false; // Must have at least one char. for (const char* p = name; p != name + length; p++) { switch(*p) { - case '.': - case ';': - case '[': + case JVM_SIGNATURE_DOT: + case JVM_SIGNATURE_ENDCLASS: + case JVM_SIGNATURE_ARRAY: // do not permit '.', ';', or '[' return false; - case '/': + case JVM_SIGNATURE_SLASH: // check for '//' or leading or trailing '/' which are not legal // unqualified name must not be empty if (type == ClassFileParser::LegalClass) { - if (p == name || p+1 >= name+length || *(p+1) == '/') { + if (p == name || p+1 >= name+length || + *(p+1) == JVM_SIGNATURE_SLASH) { return false; } } else { return false; // do not permit '/' unless it's class name } break; - case '<': - case '>': + case JVM_SIGNATURE_SPECIAL: + case JVM_SIGNATURE_ENDSPECIAL: // do not permit '<' or '>' in method names if (type == ClassFileParser::LegalMethod) { return false; @@ -5015,7 +5016,7 @@ last_is_slash = false; continue; } - if (slash_ok && ch == '/') { + if (slash_ok && ch == JVM_SIGNATURE_SLASH) { if (last_is_slash) { return NULL; // Don't permit consecutive slashes } @@ -5095,14 +5096,14 @@ const char* const p = skip_over_field_name(signature + 1, true, --length); // The next character better be a semicolon - if (p && (p - signature) > 1 && p[0] == ';') { + if (p && (p - signature) > 1 && p[0] == JVM_SIGNATURE_ENDCLASS) { return p + 1; } } else { // Skip leading 'L' and ignore first appearance of ';' signature++; - const char* c = (const char*) memchr(signature, ';', length - 1); + const char* c = (const char*) memchr(signature, JVM_SIGNATURE_ENDCLASS, length - 1); // Format check signature if (c != NULL) { int newlen = c - (char*) signature; @@ -5151,7 +5152,7 @@ p = skip_over_field_signature(bytes, false, length, CHECK); legal = (p != NULL) && ((p - bytes) == (int)length); } else if (_major_version < JAVA_1_5_VERSION) { - if (bytes[0] != '<') { + if (bytes[0] != JVM_SIGNATURE_SPECIAL) { p = skip_over_field_name(bytes, true, length); legal = (p != NULL) && ((p - bytes) == (int)length); } @@ -5186,7 +5187,7 @@ if (length > 0) { if (_major_version < JAVA_1_5_VERSION) { - if (bytes[0] != '<') { + if (bytes[0] != JVM_SIGNATURE_SPECIAL) { const char* p = skip_over_field_name(bytes, false, length); legal = (p != NULL) && ((p - bytes) == (int)length); } @@ -5219,7 +5220,7 @@ bool legal = false; if (length > 0) { - if (bytes[0] == '<') { + if (bytes[0] == JVM_SIGNATURE_SPECIAL) { if (name == vmSymbols::object_initializer_name() || name == vmSymbols::class_initializer_name()) { legal = true; } @@ -5303,7 +5304,7 @@ // The first non-signature thing better be a ')' if ((length > 0) && (*p++ == JVM_SIGNATURE_ENDFUNC)) { length--; - if (name->utf8_length() > 0 && name->char_at(0) == '<') { + if (name->utf8_length() > 0 && name->char_at(0) == JVM_SIGNATURE_SPECIAL) { // All internal methods must return void if ((length == 1) && (p[0] == JVM_SIGNATURE_VOID)) { return args_size; @@ -5705,7 +5706,7 @@ // its _class_name field. void ClassFileParser::prepend_host_package_name(const InstanceKlass* unsafe_anonymous_host, TRAPS) { ResourceMark rm(THREAD); - assert(strrchr(_class_name->as_C_string(), '/') == NULL, + assert(strrchr(_class_name->as_C_string(), JVM_SIGNATURE_SLASH) == NULL, "Unsafe anonymous class should not be in a package"); const char* host_pkg_name = ClassLoader::package_from_name(unsafe_anonymous_host->name()->as_C_string(), NULL); @@ -5738,7 +5739,7 @@ assert(_unsafe_anonymous_host != NULL, "Expected an unsafe anonymous class"); const jbyte* anon_last_slash = UTF8::strrchr((const jbyte*)_class_name->base(), - _class_name->utf8_length(), '/'); + _class_name->utf8_length(), JVM_SIGNATURE_SLASH); if (anon_last_slash == NULL) { // Unnamed package prepend_host_package_name(_unsafe_anonymous_host, CHECK); } else { @@ -6343,7 +6344,7 @@ if (class_name != NULL) { ResourceMark rm; char* name = class_name->as_C_string(); - return strchr(name, '.') == NULL; + return strchr(name, JVM_SIGNATURE_DOT) == NULL; } else { return true; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/classLoader.cpp --- a/src/hotspot/share/classfile/classLoader.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/classLoader.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -187,7 +187,7 @@ *bad_class_name = false; } - const char* const last_slash = strrchr(class_name, '/'); + const char* const last_slash = strrchr(class_name, JVM_SIGNATURE_SLASH); if (last_slash == NULL) { // No package name return NULL; @@ -195,16 +195,16 @@ char* class_name_ptr = (char*) class_name; // Skip over '['s - if (*class_name_ptr == '[') { + if (*class_name_ptr == JVM_SIGNATURE_ARRAY) { do { class_name_ptr++; - } while (*class_name_ptr == '['); + } while (*class_name_ptr == JVM_SIGNATURE_ARRAY); // Fully qualified class names should not contain a 'L'. // Set bad_class_name to true to indicate that the package name // could not be obtained due to an error condition. // In this situation, is_same_class_package returns false. - if (*class_name_ptr == 'L') { + if (*class_name_ptr == JVM_SIGNATURE_CLASS) { if (bad_class_name != NULL) { *bad_class_name = true; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/javaAssertions.cpp --- a/src/hotspot/share/classfile/javaAssertions.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/javaAssertions.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -79,7 +79,7 @@ // JVM_DesiredAssertionStatus pass the external_name() to // JavaAssertion::enabled(), but that is done once per loaded class. for (int i = 0; i < len; ++i) { - if (name_copy[i] == '.') name_copy[i] = '/'; + if (name_copy[i] == JVM_SIGNATURE_DOT) name_copy[i] = JVM_SIGNATURE_SLASH; } if (TraceJavaAssertions) { @@ -135,7 +135,7 @@ for (index = len - 1; p != 0; p = p->next(), --index) { assert(index >= 0, "length does not match list"); Handle s = java_lang_String::create_from_str(p->name(), CHECK); - s = java_lang_String::char_converter(s, '/', '.', CHECK); + s = java_lang_String::char_converter(s, JVM_SIGNATURE_SLASH, JVM_SIGNATURE_DOT, CHECK); names->obj_at_put(index, s()); enabled->bool_at_put(index, p->enabled()); } @@ -163,10 +163,10 @@ // does not include a package, length will be 0 which will match items for the // default package (from options "-ea:..." or "-da:..."). size_t len = strlen(classname); - for (/* empty */; len > 0 && classname[len] != '/'; --len) /* empty */; + for (/* empty */; len > 0 && classname[len] != JVM_SIGNATURE_SLASH; --len) /* empty */; do { - assert(len == 0 || classname[len] == '/', "not a package name"); + assert(len == 0 || classname[len] == JVM_SIGNATURE_SLASH, "not a package name"); for (OptionList* p = _packages; p != 0; p = p->next()) { if (strncmp(p->name(), classname, len) == 0 && p->name()[len] == '\0') { return p; @@ -175,7 +175,7 @@ // Find the length of the next package, taking care to avoid decrementing // past 0 (len is unsigned). - while (len > 0 && classname[--len] != '/') /* empty */; + while (len > 0 && classname[--len] != JVM_SIGNATURE_SLASH) /* empty */; } while (len > 0); return 0; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/javaClasses.hpp --- a/src/hotspot/share/classfile/javaClasses.hpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/javaClasses.hpp Mon Oct 21 13:13:16 2019 -0400 @@ -201,7 +201,9 @@ static inline bool value_equals(typeArrayOop str_value1, typeArrayOop str_value2); // Conversion between '.' and '/' formats - static Handle externalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '/', '.', THREAD); } + static Handle externalize_classname(Handle java_string, TRAPS) { + return char_converter(java_string, JVM_SIGNATURE_SLASH, JVM_SIGNATURE_DOT, THREAD); + } // Conversion static Symbol* as_symbol(oop java_string); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/modules.cpp --- a/src/hotspot/share/classfile/modules.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/modules.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -331,7 +331,7 @@ if (!h_loader.is_null() && !SystemDictionary::is_platform_class_loader(h_loader()) && (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 && - (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) { + (package_name[JAVAPKG_LEN] == JVM_SIGNATURE_SLASH || package_name[JAVAPKG_LEN] == '\0'))) { const char* class_loader_name = loader_data->loader_name_and_id(); size_t pkg_len = strlen(package_name); char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len + 1); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/systemDictionary.cpp --- a/src/hotspot/share/classfile/systemDictionary.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/systemDictionary.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2533,7 +2533,7 @@ // It's a primitive. (Void has a primitive mirror too.) char ch = type->char_at(0); - assert(is_java_primitive(char2type(ch)) || ch == 'V', ""); + assert(is_java_primitive(char2type(ch)) || ch == JVM_SIGNATURE_VOID, ""); return Handle(THREAD, find_java_mirror_for_type(ch)); } else if (FieldType::is_obj(type) || FieldType::is_array(type)) { diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/verificationType.cpp --- a/src/hotspot/share/classfile/verificationType.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/verificationType.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -122,19 +122,19 @@ assert(is_array() && name()->utf8_length() >= 2, "Must be a valid array"); Symbol* component; switch (name()->char_at(1)) { - case 'Z': return VerificationType(Boolean); - case 'B': return VerificationType(Byte); - case 'C': return VerificationType(Char); - case 'S': return VerificationType(Short); - case 'I': return VerificationType(Integer); - case 'J': return VerificationType(Long); - case 'F': return VerificationType(Float); - case 'D': return VerificationType(Double); - case '[': + 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 'L': + case JVM_SIGNATURE_CLASS: component = context->create_temporary_symbol( name(), 2, name()->utf8_length() - 1); return VerificationType::reference_type(component); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/verificationType.hpp --- a/src/hotspot/share/classfile/verificationType.hpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/verificationType.hpp Mon Oct 21 13:13:16 2019 -0400 @@ -209,24 +209,24 @@ bool is_x_array(char sig) const { return is_null() || (is_array() && (name()->char_at(1) == sig)); } - bool is_int_array() const { return is_x_array('I'); } - bool is_byte_array() const { return is_x_array('B'); } - bool is_bool_array() const { return is_x_array('Z'); } - bool is_char_array() const { return is_x_array('C'); } - bool is_short_array() const { return is_x_array('S'); } - bool is_long_array() const { return is_x_array('J'); } - bool is_float_array() const { return is_x_array('F'); } - bool is_double_array() const { return is_x_array('D'); } - bool is_object_array() const { return is_x_array('L'); } - bool is_array_array() const { return is_x_array('['); } + bool is_int_array() const { return is_x_array(JVM_SIGNATURE_INT); } + bool is_byte_array() const { return is_x_array(JVM_SIGNATURE_BYTE); } + bool is_bool_array() const { return is_x_array(JVM_SIGNATURE_BOOLEAN); } + bool is_char_array() const { return is_x_array(JVM_SIGNATURE_CHAR); } + bool is_short_array() const { return is_x_array(JVM_SIGNATURE_SHORT); } + bool is_long_array() const { return is_x_array(JVM_SIGNATURE_LONG); } + bool is_float_array() const { return is_x_array(JVM_SIGNATURE_FLOAT); } + bool is_double_array() const { return is_x_array(JVM_SIGNATURE_DOUBLE); } + bool is_object_array() const { return is_x_array(JVM_SIGNATURE_CLASS); } + bool is_array_array() const { return is_x_array(JVM_SIGNATURE_ARRAY); } bool is_reference_array() const { return is_object_array() || is_array_array(); } bool is_object() const { return (is_reference() && !is_null() && name()->utf8_length() >= 1 && - name()->char_at(0) != '['); } + name()->char_at(0) != JVM_SIGNATURE_ARRAY); } bool is_array() const { return (is_reference() && !is_null() && name()->utf8_length() >= 2 && - name()->char_at(0) == '['); } + name()->char_at(0) == JVM_SIGNATURE_ARRAY); } bool is_uninitialized() const { return ((_u._data & Uninitialized) == Uninitialized); } bool is_uninitialized_this() const @@ -322,7 +322,7 @@ int dimensions() const { assert(is_array(), "Must be an array"); int index = 0; - while (name()->char_at(index) == '[') index++; + while (name()->char_at(index) == JVM_SIGNATURE_ARRAY) index++; return index; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/verifier.cpp --- a/src/hotspot/share/classfile/verifier.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/verifier.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2852,7 +2852,7 @@ } } - if (method_name->char_at(0) == '<') { + if (method_name->char_at(0) == JVM_SIGNATURE_SPECIAL) { // Make sure can only be invoked by invokespecial if (opcode != Bytecodes::_invokespecial || method_name != vmSymbols::object_initializer_name()) { @@ -3028,21 +3028,23 @@ // Check for more than MAX_ARRAY_DIMENSIONS length = (int)strlen(component_name); if (length > MAX_ARRAY_DIMENSIONS && - component_name[MAX_ARRAY_DIMENSIONS - 1] == '[') { + component_name[MAX_ARRAY_DIMENSIONS - 1] == JVM_SIGNATURE_ARRAY) { verify_error(ErrorContext::bad_code(bci), "Illegal anewarray instruction, array has more than 255 dimensions"); } // add one dimension to component length++; arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length + 1); - int n = os::snprintf(arr_sig_str, length + 1, "[%s", component_name); + int n = os::snprintf(arr_sig_str, length + 1, "%c%s", + JVM_SIGNATURE_ARRAY, component_name); assert(n == length, "Unexpected number of characters in string"); } else { // it's an object or interface const char* component_name = component_type.name()->as_utf8(); // add one dimension to component with 'L' prepended and ';' postpended. length = (int)strlen(component_name) + 3; arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length + 1); - int n = os::snprintf(arr_sig_str, length + 1, "[L%s;", component_name); + int n = os::snprintf(arr_sig_str, length + 1, "%c%c%s;", + JVM_SIGNATURE_ARRAY, JVM_SIGNATURE_CLASS, component_name); assert(n == length, "Unexpected number of characters in string"); } Symbol* arr_sig = create_temporary_symbol(arr_sig_str, length); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/classfile/vmSymbols.cpp --- a/src/hotspot/share/classfile/vmSymbols.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/classfile/vmSymbols.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -970,7 +970,7 @@ case F_RNY:fname = "native synchronized "; break; default: break; } - const char* kptr = strrchr(kname, '/'); + const char* kptr = strrchr(kname, JVM_SIGNATURE_SLASH); if (kptr != NULL) kname = kptr + 1; int len = jio_snprintf(buf, buflen, "%s: %s%s.%s%s", str, fname, kname, mname, sname); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/compiler/methodMatcher.cpp --- a/src/hotspot/share/compiler/methodMatcher.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/compiler/methodMatcher.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -264,11 +264,13 @@ c_match = check_mode(class_name, error_msg); m_match = check_mode(method_name, error_msg); - if ((strchr(class_name, '<') != NULL) || (strchr(class_name, '>') != NULL)) { + if ((strchr(class_name, JVM_SIGNATURE_SPECIAL) != NULL) || + (strchr(class_name, JVM_SIGNATURE_ENDSPECIAL) != NULL)) { error_msg = "Chars '<' and '>' not allowed in class name"; return; } - if ((strchr(method_name, '<') != NULL) || (strchr(method_name, '>') != NULL)) { + if ((strchr(method_name, JVM_SIGNATURE_SPECIAL) != NULL) || + (strchr(method_name, JVM_SIGNATURE_ENDSPECIAL) != NULL)) { if ((strncmp("", method_name, 255) != 0) && (strncmp("", method_name, 255) != 0)) { error_msg = "Chars '<' and '>' only allowed in and "; return; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/interpreter/interpreterRuntime.cpp --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1249,15 +1249,15 @@ char sig_type = '\0'; switch(cp_entry->flag_state()) { - case btos: sig_type = 'B'; break; - case ztos: sig_type = 'Z'; break; - case ctos: sig_type = 'C'; break; - case stos: sig_type = 'S'; break; - case itos: sig_type = 'I'; break; - case ftos: sig_type = 'F'; break; - case atos: sig_type = 'L'; break; - case ltos: sig_type = 'J'; break; - case dtos: sig_type = 'D'; break; + case btos: sig_type = JVM_SIGNATURE_BYTE; break; + case ztos: sig_type = JVM_SIGNATURE_BOOLEAN; break; + case ctos: sig_type = JVM_SIGNATURE_CHAR; break; + case stos: sig_type = JVM_SIGNATURE_SHORT; break; + case itos: sig_type = JVM_SIGNATURE_INT; break; + case ftos: sig_type = JVM_SIGNATURE_FLOAT; break; + case atos: sig_type = JVM_SIGNATURE_CLASS; break; + case ltos: sig_type = JVM_SIGNATURE_LONG; break; + case dtos: sig_type = JVM_SIGNATURE_DOUBLE; break; default: ShouldNotReachHere(); return; } bool is_static = (obj == NULL); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/jvmci/compilerRuntime.cpp --- a/src/hotspot/share/jvmci/compilerRuntime.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/jvmci/compilerRuntime.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -73,7 +73,7 @@ Handle protection_domain(THREAD, caller->method_holder()->protection_domain()); // Ignore wrapping L and ; - if (name[0] == 'L') { + if (name[0] == JVM_SIGNATURE_CLASS) { assert(len > 2, "small name %s", name); name++; len -= 2; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/jvmci/jvmciCompilerToVM.cpp --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -535,8 +535,8 @@ JVMCI_THROW_MSG_NULL(ClassNotFoundException, str); } } else { - if (class_name->char_at(0) == 'L' && - class_name->char_at(class_name->utf8_length()-1) == ';') { + if (class_name->char_at(0) == JVM_SIGNATURE_CLASS && + class_name->char_at(class_name->utf8_length()-1) == JVM_SIGNATURE_ENDCLASS) { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1, diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/jvmci/jvmciRuntime.cpp --- a/src/hotspot/share/jvmci/jvmciRuntime.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -980,8 +980,8 @@ JVMCI_EXCEPTION_CONTEXT; // Now we need to check the SystemDictionary - if (sym->char_at(0) == 'L' && - sym->char_at(sym->utf8_length()-1) == ';') { + if (sym->char_at(0) == JVM_SIGNATURE_CLASS && + sym->char_at(sym->utf8_length()-1) == JVM_SIGNATURE_ENDCLASS) { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, @@ -1013,8 +1013,8 @@ // we must build an array type around it. The CI requires array klasses // to be loaded if their element klasses are loaded, except when memory // is exhausted. - if (sym->char_at(0) == '[' && - (sym->char_at(1) == '[' || sym->char_at(1) == 'L')) { + if (sym->char_at(0) == JVM_SIGNATURE_ARRAY && + (sym->char_at(1) == JVM_SIGNATURE_ARRAY || sym->char_at(1) == JVM_SIGNATURE_CLASS)) { // We have an unloaded array. // Build it on the fly if the element class exists. TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/memory/heapInspection.cpp --- a/src/hotspot/share/memory/heapInspection.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/memory/heapInspection.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,8 +72,8 @@ ResourceMark rm; const char* name1 = e1->klass()->external_name(); const char* name2 = e2->klass()->external_name(); - bool d1 = (name1[0] == '['); - bool d2 = (name2[0] == '['); + bool d1 = (name1[0] == JVM_SIGNATURE_ARRAY); + bool d2 = (name2[0] == JVM_SIGNATURE_ARRAY); if (d1 && !d2) { return -1; } else if (d2 && !d1) { diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/oops/generateOopMap.cpp --- a/src/hotspot/share/oops/generateOopMap.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/oops/generateOopMap.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1993,14 +1993,14 @@ // This is used to parse the signature for fields, since they are very simple... CellTypeState *GenerateOopMap::sigchar_to_effect(char sigch, int bci, CellTypeState *out) { // Object and array - if (sigch=='L' || sigch=='[') { + if (sigch==JVM_SIGNATURE_CLASS || sigch==JVM_SIGNATURE_ARRAY) { out[0] = CellTypeState::make_line_ref(bci); out[1] = CellTypeState::bottom; return out; } - if (sigch == 'J' || sigch == 'D' ) return vvCTS; // Long and Double - if (sigch == 'V' ) return epsilonCTS; // Void - return vCTS; // Otherwise + if (sigch == JVM_SIGNATURE_LONG || sigch == JVM_SIGNATURE_DOUBLE) return vvCTS; // Long and Double + if (sigch == JVM_SIGNATURE_VOID) return epsilonCTS; // Void + return vCTS; // Otherwise } long GenerateOopMap::_total_byte_count = 0; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/oops/instanceKlass.cpp --- a/src/hotspot/share/oops/instanceKlass.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/oops/instanceKlass.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2594,7 +2594,7 @@ // Add L as type indicator int dest_index = 0; - dest[dest_index++] = 'L'; + dest[dest_index++] = JVM_SIGNATURE_CLASS; // Add the actual class name for (int src_index = 0; src_index < src_length; ) { @@ -2607,7 +2607,7 @@ } // Add the semicolon and the NULL - dest[dest_index++] = ';'; + dest[dest_index++] = JVM_SIGNATURE_ENDCLASS; dest[dest_index] = '\0'; return dest; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/oops/objArrayKlass.cpp --- a/src/hotspot/share/oops/objArrayKlass.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/oops/objArrayKlass.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -106,14 +106,14 @@ int len = element_klass->name()->utf8_length(); char *new_str = NEW_RESOURCE_ARRAY(char, len + 4); int idx = 0; - new_str[idx++] = '['; + new_str[idx++] = JVM_SIGNATURE_ARRAY; if (element_klass->is_instance_klass()) { // it could be an array or simple type - new_str[idx++] = 'L'; + new_str[idx++] = JVM_SIGNATURE_CLASS; } memcpy(&new_str[idx], name_str, len * sizeof(char)); idx += len; if (element_klass->is_instance_klass()) { - new_str[idx++] = ';'; + new_str[idx++] = JVM_SIGNATURE_ENDCLASS; } new_str[idx++] = '\0'; name = SymbolTable::new_permanent_symbol(new_str); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/oops/symbol.cpp --- a/src/hotspot/share/oops/symbol.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/oops/symbol.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -201,8 +201,8 @@ int length = (int)strlen(str); // Turn all '/'s into '.'s (also for array klasses) for (int index = 0; index < length; index++) { - if (str[index] == '/') { - str[index] = '.'; + if (str[index] == JVM_SIGNATURE_SLASH) { + str[index] = JVM_SIGNATURE_DOT; } } return str; @@ -210,8 +210,8 @@ static void print_class(outputStream *os, char *class_str, int len) { for (int i = 0; i < len; ++i) { - if (class_str[i] == '/') { - os->put('.'); + if (class_str[i] == JVM_SIGNATURE_SLASH) { + os->put(JVM_SIGNATURE_DOT); } else { os->put(class_str[i]); } @@ -221,9 +221,9 @@ static void print_array(outputStream *os, char *array_str, int len) { int dimensions = 0; for (int i = 0; i < len; ++i) { - if (array_str[i] == '[') { + if (array_str[i] == JVM_SIGNATURE_ARRAY) { dimensions++; - } else if (array_str[i] == 'L') { + } else if (array_str[i] == JVM_SIGNATURE_CLASS) { // Expected format: L;. Skip 'L' and ';' delimiting the type name. print_class(os, array_str+i+1, len-i-2); break; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jni.cpp --- a/src/hotspot/share/prims/jni.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jni.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2151,7 +2151,7 @@ if (JvmtiExport::should_post_field_modification()) { jvalue field_value; field_value.l = value; - o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value); + o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, JVM_SIGNATURE_CLASS, (jvalue *)&field_value); } HeapAccess::oop_store_at(o, offset, JNIHandles::resolve(value)); HOTSPOT_JNI_SETOBJECTFIELD_RETURN(); @@ -2177,34 +2177,34 @@ field_value.unionType = value; \ o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \ } \ - if (SigType == 'Z') { value = ((jboolean)value) & 1; } \ + if (SigType == JVM_SIGNATURE_BOOLEAN) { value = ((jboolean)value) & 1; } \ o->Fieldname##_field_put(offset, value); \ ReturnProbe; \ JNI_END -DEFINE_SETFIELD(jboolean, bool, Boolean, 'Z', z +DEFINE_SETFIELD(jboolean, bool, Boolean, JVM_SIGNATURE_BOOLEAN, z , HOTSPOT_JNI_SETBOOLEANFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETBOOLEANFIELD_RETURN()) -DEFINE_SETFIELD(jbyte, byte, Byte, 'B', b +DEFINE_SETFIELD(jbyte, byte, Byte, JVM_SIGNATURE_BYTE, b , HOTSPOT_JNI_SETBYTEFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETBYTEFIELD_RETURN()) -DEFINE_SETFIELD(jchar, char, Char, 'C', c +DEFINE_SETFIELD(jchar, char, Char, JVM_SIGNATURE_CHAR, c , HOTSPOT_JNI_SETCHARFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETCHARFIELD_RETURN()) -DEFINE_SETFIELD(jshort, short, Short, 'S', s +DEFINE_SETFIELD(jshort, short, Short, JVM_SIGNATURE_SHORT, s , HOTSPOT_JNI_SETSHORTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETSHORTFIELD_RETURN()) -DEFINE_SETFIELD(jint, int, Int, 'I', i +DEFINE_SETFIELD(jint, int, Int, JVM_SIGNATURE_INT, i , HOTSPOT_JNI_SETINTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETINTFIELD_RETURN()) -DEFINE_SETFIELD(jlong, long, Long, 'J', j +DEFINE_SETFIELD(jlong, long, Long, JVM_SIGNATURE_LONG, j , HOTSPOT_JNI_SETLONGFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETLONGFIELD_RETURN()) // Float and double probes don't return value because dtrace doesn't currently support it -DEFINE_SETFIELD(jfloat, float, Float, 'F', f +DEFINE_SETFIELD(jfloat, float, Float, JVM_SIGNATURE_FLOAT, f , HOTSPOT_JNI_SETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID), HOTSPOT_JNI_SETFLOATFIELD_RETURN()) -DEFINE_SETFIELD(jdouble, double, Double, 'D', d +DEFINE_SETFIELD(jdouble, double, Double, JVM_SIGNATURE_DOUBLE, d , HOTSPOT_JNI_SETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID), HOTSPOT_JNI_SETDOUBLEFIELD_RETURN()) @@ -2352,7 +2352,7 @@ if (JvmtiExport::should_post_field_modification()) { jvalue field_value; field_value.l = value; - JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value); + JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, JVM_SIGNATURE_CLASS, (jvalue *)&field_value); } id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value)); HOTSPOT_JNI_SETSTATICOBJECTFIELD_RETURN(); @@ -2376,34 +2376,34 @@ field_value.unionType = value; \ JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \ } \ - if (SigType == 'Z') { value = ((jboolean)value) & 1; } \ + if (SigType == JVM_SIGNATURE_BOOLEAN) { value = ((jboolean)value) & 1; } \ id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \ ReturnProbe;\ JNI_END -DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, 'Z', z +DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, JVM_SIGNATURE_BOOLEAN, z , HOTSPOT_JNI_SETSTATICBOOLEANFIELD_ENTRY(env, clazz, (uintptr_t)fieldID, value), HOTSPOT_JNI_SETSTATICBOOLEANFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jbyte, byte, Byte, 'B', b +DEFINE_SETSTATICFIELD(jbyte, byte, Byte, JVM_SIGNATURE_BYTE, b , HOTSPOT_JNI_SETSTATICBYTEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value), HOTSPOT_JNI_SETSTATICBYTEFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jchar, char, Char, 'C', c +DEFINE_SETSTATICFIELD(jchar, char, Char, JVM_SIGNATURE_CHAR, c , HOTSPOT_JNI_SETSTATICCHARFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value), HOTSPOT_JNI_SETSTATICCHARFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jshort, short, Short, 'S', s +DEFINE_SETSTATICFIELD(jshort, short, Short, JVM_SIGNATURE_SHORT, s , HOTSPOT_JNI_SETSTATICSHORTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value), HOTSPOT_JNI_SETSTATICSHORTFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jint, int, Int, 'I', i +DEFINE_SETSTATICFIELD(jint, int, Int, JVM_SIGNATURE_INT, i , HOTSPOT_JNI_SETSTATICINTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value), HOTSPOT_JNI_SETSTATICINTFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jlong, long, Long, 'J', j +DEFINE_SETSTATICFIELD(jlong, long, Long, JVM_SIGNATURE_LONG, j , HOTSPOT_JNI_SETSTATICLONGFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value), HOTSPOT_JNI_SETSTATICLONGFIELD_RETURN()) // Float and double probes don't return value because dtrace doesn't currently support it -DEFINE_SETSTATICFIELD(jfloat, float, Float, 'F', f +DEFINE_SETSTATICFIELD(jfloat, float, Float, JVM_SIGNATURE_FLOAT, f , HOTSPOT_JNI_SETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_SETSTATICFLOATFIELD_RETURN()) -DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d +DEFINE_SETSTATICFIELD(jdouble, double, Double, JVM_SIGNATURE_DOUBLE, d , HOTSPOT_JNI_SETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_SETSTATICDOUBLEFIELD_RETURN()) diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jvmtiEnvBase.cpp --- a/src/hotspot/share/prims/jvmtiEnvBase.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1361,7 +1361,7 @@ NULL_CHECK(ob_k, JVMTI_ERROR_INVALID_OBJECT); // Method return type signature. - char* ty_sign = 1 + strchr(signature->as_C_string(), ')'); + char* ty_sign = 1 + strchr(signature->as_C_string(), JVM_SIGNATURE_ENDFUNC); if (!VM_GetOrSetLocal::is_assignable(ty_sign, ob_k, current_thread)) { return JVMTI_ERROR_TYPE_MISMATCH; diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jvmtiExport.cpp --- a/src/hotspot/share/prims/jvmtiExport.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jvmtiExport.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1994,7 +1994,9 @@ address location, Klass* field_klass, Handle object, jfieldID field, char sig_type, jvalue *value) { - if (sig_type == 'I' || sig_type == 'Z' || sig_type == 'B' || sig_type == 'C' || sig_type == 'S') { + if (sig_type == JVM_SIGNATURE_INT || sig_type == JVM_SIGNATURE_BOOLEAN || + sig_type == JVM_SIGNATURE_BYTE || sig_type == JVM_SIGNATURE_CHAR || + sig_type == JVM_SIGNATURE_SHORT) { // 'I' instructions are used for byte, char, short and int. // determine which it really is, and convert fieldDescriptor fd; @@ -2005,22 +2007,22 @@ // convert value from int to appropriate type switch (fd.field_type()) { case T_BOOLEAN: - sig_type = 'Z'; + sig_type = JVM_SIGNATURE_BOOLEAN; value->i = 0; // clear it value->z = (jboolean)ival; break; case T_BYTE: - sig_type = 'B'; + sig_type = JVM_SIGNATURE_BYTE; value->i = 0; // clear it value->b = (jbyte)ival; break; case T_CHAR: - sig_type = 'C'; + sig_type = JVM_SIGNATURE_CHAR; value->i = 0; // clear it value->c = (jchar)ival; break; case T_SHORT: - sig_type = 'S'; + sig_type = JVM_SIGNATURE_SHORT; value->i = 0; // clear it value->s = (jshort)ival; break; @@ -2035,11 +2037,11 @@ } } - assert(sig_type != '[', "array should have sig_type == 'L'"); + assert(sig_type != JVM_SIGNATURE_ARRAY, "array should have sig_type == 'L'"); bool handle_created = false; // convert oop to JNI handle. - if (sig_type == 'L') { + if (sig_type == JVM_SIGNATURE_CLASS) { handle_created = true; value->l = (jobject)JNIHandles::make_local(thread, (oop)value->l); } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jvmtiImpl.cpp --- a/src/hotspot/share/prims/jvmtiImpl.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jvmtiImpl.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -588,7 +588,8 @@ assert(klass != NULL, "klass must not be NULL"); int len = (int) strlen(ty_sign); - if (ty_sign[0] == 'L' && ty_sign[len-1] == ';') { // Need pure class/interface name + if (ty_sign[0] == JVM_SIGNATURE_CLASS && + ty_sign[len-1] == JVM_SIGNATURE_ENDCLASS) { // Need pure class/interface name ty_sign++; len -= 2; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jvmtiRedefineClasses.cpp --- a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2166,14 +2166,14 @@ switch (tag) { // These BaseType tag values are from Table 4.2 in VM spec: - case 'B': // byte - case 'C': // char - case 'D': // double - case 'F': // float - case 'I': // int - case 'J': // long - case 'S': // short - case 'Z': // boolean + case JVM_SIGNATURE_BYTE: + case JVM_SIGNATURE_CHAR: + case JVM_SIGNATURE_DOUBLE: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_SHORT: + case JVM_SIGNATURE_BOOLEAN: // The remaining tag values are from Table 4.8 in the 2nd-edition of // the VM spec: @@ -2244,7 +2244,7 @@ } break; - case '[': + case JVM_SIGNATURE_ARRAY: { if ((byte_i_ref + 2) > annotations_typeArray->length()) { // not enough room for a num_values field diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/jvmtiTagMap.cpp --- a/src/hotspot/share/prims/jvmtiTagMap.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/jvmtiTagMap.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1032,7 +1032,7 @@ // helper function to tell if a field is a primitive field or not static inline bool is_primitive_field_type(char type) { - return (type != 'L' && type != '['); + return (type != JVM_SIGNATURE_CLASS && type != JVM_SIGNATURE_ARRAY); } // helper function to copy the value from location addr to jvalue. diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/methodHandles.cpp --- a/src/hotspot/share/prims/methodHandles.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/methodHandles.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -542,18 +542,22 @@ const int len = sig->utf8_length(); for (int i = 0; i < len; i++) { switch (sig->char_at(i)) { - case 'L': + case JVM_SIGNATURE_CLASS: // only java/lang/Object is valid here if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i) return false; i += OBJ_SIG_LEN-1; //-1 because of i++ in loop continue; - case '(': case ')': case 'V': - case 'I': case 'J': case 'F': case 'D': + case JVM_SIGNATURE_FUNC: + case JVM_SIGNATURE_ENDFUNC: + case JVM_SIGNATURE_VOID: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_DOUBLE: continue; - //case '[': - //case 'Z': case 'B': case 'C': case 'S': default: + // subword types (T_BYTE etc.), arrays return false; } } @@ -567,7 +571,7 @@ } else if (is_basic_type_signature(sig)) { sig->increment_refcount(); return sig; // that was easy - } else if (sig->char_at(0) != '(') { + } else if (sig->char_at(0) != JVM_SIGNATURE_FUNC) { BasicType bt = char2type(sig->char_at(0)); if (is_subword_type(bt)) { bsig = vmSymbols::int_signature(); @@ -578,7 +582,7 @@ } else { ResourceMark rm; stringStream buffer(128); - buffer.put('('); + buffer.put(JVM_SIGNATURE_FUNC); int arg_pos = 0, keep_arg_pos = -1; if (keep_last_arg) keep_arg_pos = ArgumentCount(sig).size() - 1; @@ -586,7 +590,7 @@ BasicType bt = ss.type(); size_t this_arg_pos = buffer.size(); if (ss.at_return_type()) { - buffer.put(')'); + buffer.put(JVM_SIGNATURE_ENDFUNC); } if (arg_pos == keep_arg_pos) { buffer.write((char*) ss.raw_bytes(), @@ -621,25 +625,26 @@ for (int i = 0; i < len; i++) { char ch = sig->char_at(i); switch (ch) { - case '(': case ')': + case JVM_SIGNATURE_FUNC: + case JVM_SIGNATURE_ENDFUNC: prev_type = false; st->put(ch); continue; - case '[': + case JVM_SIGNATURE_ARRAY: if (!keep_basic_names && keep_arrays) st->put(ch); array++; continue; - case 'L': + case JVM_SIGNATURE_CLASS: { if (prev_type) st->put(','); int start = i+1, slash = start; - while (++i < len && (ch = sig->char_at(i)) != ';') { - if (ch == '/' || ch == '.' || ch == '$') slash = i+1; + while (++i < len && (ch = sig->char_at(i)) != JVM_SIGNATURE_ENDCLASS) { + if (ch == JVM_SIGNATURE_SLASH || ch == JVM_SIGNATURE_DOT || ch == '$') slash = i+1; } if (slash < i) start = slash; if (!keep_basic_names) { - st->put('L'); + st->put(JVM_SIGNATURE_CLASS); } else { for (int j = start; j < i; j++) st->put(sig->char_at(j)); @@ -650,7 +655,7 @@ default: { if (array && char2type(ch) != T_ILLEGAL && !keep_arrays) { - ch = '['; + ch = JVM_SIGNATURE_ARRAY; array = 0; } if (prev_type) st->put(','); @@ -978,7 +983,7 @@ } if (sig != NULL) { if (sig->utf8_length() == 0) return 0; // a match is not possible - if (sig->char_at(0) == '(') + if (sig->char_at(0) == JVM_SIGNATURE_FUNC) match_flags &= ~(IS_FIELD | IS_TYPE); else match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD); @@ -1456,7 +1461,7 @@ { Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool); Handle th; - if (type->char_at(0) == '(') { + if (type->char_at(0) == JVM_SIGNATURE_FUNC) { th = SystemDictionary::find_method_handle_type(type, caller, CHECK); } else { th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/prims/nativeLookup.cpp --- a/src/hotspot/share/prims/nativeLookup.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/prims/nativeLookup.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -106,7 +106,7 @@ st.print("__"); // find ')' int end; - for (end = 0; end < signature->utf8_length() && signature->char_at(end) != ')'; end++); + for (end = 0; end < signature->utf8_length() && signature->char_at(end) != JVM_SIGNATURE_ENDFUNC; end++); // skip first '(' mangle_name_on(&st, signature, 1, end); return st.as_string(); diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/runtime/fieldType.cpp --- a/src/hotspot/share/runtime/fieldType.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/runtime/fieldType.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -39,28 +39,28 @@ // Check if it is a valid array signature bool FieldType::is_valid_array_signature(Symbol* sig) { assert(sig->utf8_length() > 1, "this should already have been checked"); - assert(sig->char_at(0) == '[', "this should already have been checked"); + assert(sig->char_at(0) == JVM_SIGNATURE_ARRAY, "this should already have been checked"); // The first character is already checked int i = 1; int len = sig->utf8_length(); // First skip all '['s - while(i < len - 1 && sig->char_at(i) == '[') i++; + while(i < len - 1 && sig->char_at(i) == JVM_SIGNATURE_ARRAY) i++; // Check type switch(sig->char_at(i)) { - case 'B': // T_BYTE - case 'C': // T_CHAR - case 'D': // T_DOUBLE - case 'F': // T_FLOAT - case 'I': // T_INT - case 'J': // T_LONG - case 'S': // T_SHORT - case 'Z': // T_BOOLEAN + case JVM_SIGNATURE_BYTE: + case JVM_SIGNATURE_CHAR: + case JVM_SIGNATURE_DOUBLE: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_SHORT: + case JVM_SIGNATURE_BOOLEAN: // If it is an array, the type is the last character return (i + 1 == len); - case 'L': + case JVM_SIGNATURE_CLASS: // If it is an object, the last character must be a ';' - return sig->char_at(len - 1) == ';'; + return sig->char_at(len - 1) == JVM_SIGNATURE_ENDCLASS; } return false; @@ -71,7 +71,7 @@ assert(basic_type(signature) == T_ARRAY, "must be array"); int index = 1; int dim = 1; - while (signature->char_at(index) == '[') { + while (signature->char_at(index) == JVM_SIGNATURE_ARRAY) { index++; dim++; } @@ -80,7 +80,7 @@ BasicType element_type = char2type(element[0]); if (element_type == T_OBJECT) { int len = (int)strlen(element); - assert(element[len-1] == ';', "last char should be a semicolon"); + assert(element[len-1] == JVM_SIGNATURE_ENDCLASS, "last char should be a semicolon"); element[len-1] = '\0'; // chop off semicolon fd._object_key = SymbolTable::new_symbol(element + 1); } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/runtime/fieldType.hpp --- a/src/hotspot/share/runtime/fieldType.hpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/runtime/fieldType.hpp Mon Oct 21 13:13:16 2019 -0400 @@ -58,14 +58,16 @@ static BasicType basic_type(Symbol* signature); // Testing - static bool is_array(Symbol* signature) { return signature->utf8_length() > 1 && signature->char_at(0) == '[' && is_valid_array_signature(signature); } + static bool is_array(Symbol* signature) { return signature->utf8_length() > 1 && + signature->char_at(0) == JVM_SIGNATURE_ARRAY && + is_valid_array_signature(signature); } static bool is_obj(Symbol* signature) { int sig_length = signature->utf8_length(); // Must start with 'L' and end with ';' return (sig_length >= 2 && - (signature->char_at(0) == 'L') && - (signature->char_at(sig_length - 1) == ';')); + (signature->char_at(0) == JVM_SIGNATURE_CLASS) && + (signature->char_at(sig_length - 1) == JVM_SIGNATURE_ENDCLASS)); } // Parse field and extract array information. Works for T_ARRAY only. diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/runtime/sharedRuntime.cpp --- a/src/hotspot/share/runtime/sharedRuntime.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/runtime/sharedRuntime.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -2990,28 +2990,28 @@ sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature } - while (*s != ')') { // Find closing right paren - switch (*s++) { // Switch on signature character - case 'B': sig_bt[cnt++] = T_BYTE; break; - case 'C': sig_bt[cnt++] = T_CHAR; break; - case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break; - case 'F': sig_bt[cnt++] = T_FLOAT; break; - case 'I': sig_bt[cnt++] = T_INT; break; - case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break; - case 'S': sig_bt[cnt++] = T_SHORT; break; - case 'Z': sig_bt[cnt++] = T_BOOLEAN; break; - case 'V': sig_bt[cnt++] = T_VOID; break; - case 'L': // Oop - while (*s++ != ';'); // Skip signature + while (*s != JVM_SIGNATURE_ENDFUNC) { // Find closing right paren + switch (*s++) { // Switch on signature character + case JVM_SIGNATURE_BYTE: sig_bt[cnt++] = T_BYTE; break; + case JVM_SIGNATURE_CHAR: sig_bt[cnt++] = T_CHAR; break; + case JVM_SIGNATURE_DOUBLE: sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break; + case JVM_SIGNATURE_FLOAT: sig_bt[cnt++] = T_FLOAT; break; + case JVM_SIGNATURE_INT: sig_bt[cnt++] = T_INT; break; + case JVM_SIGNATURE_LONG: sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break; + case JVM_SIGNATURE_SHORT: sig_bt[cnt++] = T_SHORT; break; + case JVM_SIGNATURE_BOOLEAN: sig_bt[cnt++] = T_BOOLEAN; break; + case JVM_SIGNATURE_VOID: sig_bt[cnt++] = T_VOID; break; + case JVM_SIGNATURE_CLASS: // Oop + while (*s++ != JVM_SIGNATURE_ENDCLASS); // Skip signature sig_bt[cnt++] = T_OBJECT; break; - case '[': { // Array + case JVM_SIGNATURE_ARRAY: { // Array do { // Skip optional size while (*s >= '0' && *s <= '9') s++; - } while (*s++ == '['); // Nested arrays? + } while (*s++ == JVM_SIGNATURE_ARRAY); // Nested arrays? // Skip element type - if (s[-1] == 'L') - while (*s++ != ';'); // Skip signature + if (s[-1] == JVM_SIGNATURE_CLASS) + while (*s++ != JVM_SIGNATURE_ENDCLASS); // Skip signature sig_bt[cnt++] = T_ARRAY; break; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/runtime/signature.cpp --- a/src/hotspot/share/runtime/signature.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/runtime/signature.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -63,41 +63,41 @@ // compiler bug (was problem - gri 4/27/2000). int size = -1; switch(_signature->char_at(_index)) { - case 'B': do_byte (); if (_parameter_index < 0 ) _return_type = T_BYTE; - _index++; size = T_BYTE_size ; break; - case 'C': do_char (); if (_parameter_index < 0 ) _return_type = T_CHAR; - _index++; size = T_CHAR_size ; break; - case 'D': do_double(); if (_parameter_index < 0 ) _return_type = T_DOUBLE; - _index++; size = T_DOUBLE_size ; break; - case 'F': do_float (); if (_parameter_index < 0 ) _return_type = T_FLOAT; - _index++; size = T_FLOAT_size ; break; - case 'I': do_int (); if (_parameter_index < 0 ) _return_type = T_INT; - _index++; size = T_INT_size ; break; - case 'J': do_long (); if (_parameter_index < 0 ) _return_type = T_LONG; - _index++; size = T_LONG_size ; break; - case 'S': do_short (); if (_parameter_index < 0 ) _return_type = T_SHORT; - _index++; size = T_SHORT_size ; break; - case 'Z': do_bool (); if (_parameter_index < 0 ) _return_type = T_BOOLEAN; - _index++; size = T_BOOLEAN_size; break; - case 'V': do_void (); if (_parameter_index < 0 ) _return_type = T_VOID; - _index++; size = T_VOID_size; ; break; - case 'L': + case JVM_SIGNATURE_BYTE: do_byte(); if (_parameter_index < 0 ) _return_type = T_BYTE; + _index++; size = T_BYTE_size; break; + case JVM_SIGNATURE_CHAR: do_char(); if (_parameter_index < 0 ) _return_type = T_CHAR; + _index++; size = T_CHAR_size; break; + case JVM_SIGNATURE_DOUBLE: do_double(); if (_parameter_index < 0 ) _return_type = T_DOUBLE; + _index++; size = T_DOUBLE_size; break; + case JVM_SIGNATURE_FLOAT: do_float(); if (_parameter_index < 0 ) _return_type = T_FLOAT; + _index++; size = T_FLOAT_size; break; + case JVM_SIGNATURE_INT: do_int(); if (_parameter_index < 0 ) _return_type = T_INT; + _index++; size = T_INT_size; break; + case JVM_SIGNATURE_LONG: do_long(); if (_parameter_index < 0 ) _return_type = T_LONG; + _index++; size = T_LONG_size; break; + case JVM_SIGNATURE_SHORT: do_short(); if (_parameter_index < 0 ) _return_type = T_SHORT; + _index++; size = T_SHORT_size; break; + case JVM_SIGNATURE_BOOLEAN: do_bool(); if (_parameter_index < 0 ) _return_type = T_BOOLEAN; + _index++; size = T_BOOLEAN_size; break; + case JVM_SIGNATURE_VOID: do_void(); if (_parameter_index < 0 ) _return_type = T_VOID; + _index++; size = T_VOID_size; break; + case JVM_SIGNATURE_CLASS: { int begin = ++_index; Symbol* sig = _signature; - while (sig->char_at(_index++) != ';') ; + while (sig->char_at(_index++) != JVM_SIGNATURE_ENDCLASS) ; do_object(begin, _index); } if (_parameter_index < 0 ) _return_type = T_OBJECT; size = T_OBJECT_size; break; - case '[': + case JVM_SIGNATURE_ARRAY: { int begin = ++_index; Symbol* sig = _signature; - while (sig->char_at(_index) == '[') { + while (sig->char_at(_index) == JVM_SIGNATURE_ARRAY) { _index++; } - if (sig->char_at(_index) == 'L') { - while (sig->char_at(_index++) != ';') ; + if (sig->char_at(_index) == JVM_SIGNATURE_CLASS) { + while (sig->char_at(_index++) != JVM_SIGNATURE_ENDCLASS) ; } else { _index++; } @@ -128,9 +128,9 @@ // Parse parameters _index = 0; _parameter_index = 0; - expect('('); - while (_signature->char_at(_index) != ')') _parameter_index += parse_type(); - expect(')'); + expect(JVM_SIGNATURE_FUNC); + while (_signature->char_at(_index) != JVM_SIGNATURE_ENDFUNC) _parameter_index += parse_type(); + expect(JVM_SIGNATURE_ENDFUNC); _parameter_index = 0; } @@ -202,36 +202,36 @@ void SignatureIterator::iterate_returntype() { // Ignore parameters _index = 0; - expect('('); + expect(JVM_SIGNATURE_FUNC); Symbol* sig = _signature; // Need to skip over each type in the signature's argument list until a // closing ')' is found., then get the return type. We cannot just scan // for the first ')' because ')' is a legal character in a type name. - while (sig->char_at(_index) != ')') { + while (sig->char_at(_index) != JVM_SIGNATURE_ENDFUNC) { switch(sig->char_at(_index)) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': - case 'V': + case JVM_SIGNATURE_BYTE: + case JVM_SIGNATURE_CHAR: + case JVM_SIGNATURE_DOUBLE: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_SHORT: + case JVM_SIGNATURE_BOOLEAN: + case JVM_SIGNATURE_VOID: { _index++; } break; - case 'L': + case JVM_SIGNATURE_CLASS: { - while (sig->char_at(_index++) != ';') ; + while (sig->char_at(_index++) != JVM_SIGNATURE_ENDCLASS) ; } break; - case '[': + case JVM_SIGNATURE_ARRAY: { - while (sig->char_at(++_index) == '[') ; - if (sig->char_at(_index) == 'L') { - while (sig->char_at(_index++) != ';') ; + while (sig->char_at(++_index) == JVM_SIGNATURE_ARRAY) ; + if (sig->char_at(_index) == JVM_SIGNATURE_CLASS) { + while (sig->char_at(_index++) != JVM_SIGNATURE_ENDCLASS) ; } else { _index++; } @@ -242,7 +242,7 @@ break; } } - expect(')'); + expect(JVM_SIGNATURE_ENDFUNC); // Parse return type _parameter_index = -1; parse_type(); @@ -255,9 +255,9 @@ // Parse parameters _parameter_index = 0; _index = 0; - expect('('); - while (_signature->char_at(_index) != ')') _parameter_index += parse_type(); - expect(')'); + expect(JVM_SIGNATURE_FUNC); + while (_signature->char_at(_index) != JVM_SIGNATURE_ENDFUNC) _parameter_index += parse_type(); + expect(JVM_SIGNATURE_ENDFUNC); // Parse return type _parameter_index = -1; parse_type(); @@ -289,39 +289,39 @@ void SignatureStream::next_non_primitive(int t) { switch (t) { - case 'L': { + case JVM_SIGNATURE_CLASS: { _type = T_OBJECT; Symbol* sig = _signature; - while (sig->char_at(_end++) != ';'); + while (sig->char_at(_end++) != JVM_SIGNATURE_ENDCLASS); break; } - case '[': { + case JVM_SIGNATURE_ARRAY: { _type = T_ARRAY; Symbol* sig = _signature; char c = sig->char_at(_end); while ('0' <= c && c <= '9') c = sig->char_at(_end++); - while (sig->char_at(_end) == '[') { + while (sig->char_at(_end) == JVM_SIGNATURE_ARRAY) { _end++; c = sig->char_at(_end); while ('0' <= c && c <= '9') c = sig->char_at(_end++); } switch(sig->char_at(_end)) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z':_end++; break; + case JVM_SIGNATURE_BYTE: + case JVM_SIGNATURE_CHAR: + case JVM_SIGNATURE_DOUBLE: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_SHORT: + case JVM_SIGNATURE_BOOLEAN:_end++; break; default: { - while (sig->char_at(_end++) != ';'); + while (sig->char_at(_end++) != JVM_SIGNATURE_ENDCLASS); break; } } break; } - case ')': _end++; next(); _at_return_type = true; break; + case JVM_SIGNATURE_ENDFUNC: _end++; next(); _at_return_type = true; break; default : ShouldNotReachHere(); } } @@ -341,8 +341,8 @@ int begin = _begin; int end = _end; - if ( _signature->char_at(_begin) == 'L' - && _signature->char_at(_end-1) == ';') { + if ( _signature->char_at(_begin) == JVM_SIGNATURE_CLASS + && _signature->char_at(_end-1) == JVM_SIGNATURE_ENDCLASS) { begin++; end--; } @@ -407,8 +407,8 @@ int begin = _begin; int end = _end; - if ( _signature->char_at(_begin) == 'L' - && _signature->char_at(_end-1) == ';') { + if ( _signature->char_at(_begin) == JVM_SIGNATURE_CLASS + && _signature->char_at(_end-1) == JVM_SIGNATURE_ENDCLASS) { begin++; end--; } @@ -436,9 +436,9 @@ const char* method_sig = (const char*)sig->bytes(); ssize_t len = sig->utf8_length(); ssize_t index = 0; - if (method_sig != NULL && len > 1 && method_sig[index] == '(') { + if (method_sig != NULL && len > 1 && method_sig[index] == JVM_SIGNATURE_FUNC) { ++index; - while (index < len && method_sig[index] != ')') { + while (index < len && method_sig[index] != JVM_SIGNATURE_ENDFUNC) { ssize_t res = is_valid_type(&method_sig[index], len - index); if (res == -1) { return false; @@ -446,7 +446,7 @@ index += res; } } - if (index < len && method_sig[index] == ')') { + if (index < len && method_sig[index] == JVM_SIGNATURE_ENDFUNC) { // check the return type ++index; return (is_valid_type(&method_sig[index], len - index) == (len - index)); @@ -469,21 +469,28 @@ ssize_t index = 0; // Iterate over any number of array dimensions - while (index < limit && type[index] == '[') ++index; + while (index < limit && type[index] == JVM_SIGNATURE_ARRAY) ++index; if (index >= limit) { return -1; } switch (type[index]) { - case 'B': case 'C': case 'D': case 'F': case 'I': - case 'J': case 'S': case 'Z': case 'V': + case JVM_SIGNATURE_BYTE: + case JVM_SIGNATURE_CHAR: + case JVM_SIGNATURE_DOUBLE: + case JVM_SIGNATURE_FLOAT: + case JVM_SIGNATURE_INT: + case JVM_SIGNATURE_LONG: + case JVM_SIGNATURE_SHORT: + case JVM_SIGNATURE_BOOLEAN: + case JVM_SIGNATURE_VOID: return index + 1; - case 'L': + case JVM_SIGNATURE_CLASS: for (index = index + 1; index < limit; ++index) { char c = type[index]; switch (c) { - case ';': + case JVM_SIGNATURE_ENDCLASS: return index + 1; - case '\0': case '.': case '[': + case '\0': case JVM_SIGNATURE_DOT: case JVM_SIGNATURE_ARRAY: return -1; default: ; // fall through } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/runtime/signature.hpp --- a/src/hotspot/share/runtime/signature.hpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/runtime/signature.hpp Mon Oct 21 13:13:16 2019 -0400 @@ -379,15 +379,15 @@ _begin = _end; int t = sig->char_at(_begin); switch (t) { - case 'B': _type = T_BYTE; break; - case 'C': _type = T_CHAR; break; - case 'D': _type = T_DOUBLE; break; - case 'F': _type = T_FLOAT; break; - case 'I': _type = T_INT; break; - case 'J': _type = T_LONG; break; - case 'S': _type = T_SHORT; break; - case 'Z': _type = T_BOOLEAN; break; - case 'V': _type = T_VOID; break; + case JVM_SIGNATURE_BYTE: _type = T_BYTE; break; + case JVM_SIGNATURE_CHAR: _type = T_CHAR; break; + case JVM_SIGNATURE_DOUBLE: _type = T_DOUBLE; break; + case JVM_SIGNATURE_FLOAT: _type = T_FLOAT; break; + case JVM_SIGNATURE_INT: _type = T_INT; break; + case JVM_SIGNATURE_LONG: _type = T_LONG; break; + case JVM_SIGNATURE_SHORT: _type = T_SHORT; break; + case JVM_SIGNATURE_BOOLEAN: _type = T_BOOLEAN; break; + case JVM_SIGNATURE_VOID: _type = T_VOID; break; default : next_non_primitive(t); return; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/utilities/globalDefinitions.cpp --- a/src/hotspot/share/utilities/globalDefinitions.cpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/utilities/globalDefinitions.cpp Mon Oct 21 13:13:16 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -178,7 +178,16 @@ // Map BasicType to signature character -char type2char_tab[T_CONFLICT+1]={ 0, 0, 0, 0, 'Z', 'C', 'F', 'D', 'B', 'S', 'I', 'J', 'L', '[', 'V', 0, 0, 0, 0, 0}; +char type2char_tab[T_CONFLICT+1] = { + 0, 0, 0, 0, + JVM_SIGNATURE_BOOLEAN, JVM_SIGNATURE_CHAR, + JVM_SIGNATURE_FLOAT, JVM_SIGNATURE_DOUBLE, + JVM_SIGNATURE_BYTE, JVM_SIGNATURE_SHORT, + JVM_SIGNATURE_INT, JVM_SIGNATURE_LONG, + JVM_SIGNATURE_CLASS, JVM_SIGNATURE_ARRAY, + JVM_SIGNATURE_VOID, 0, + 0, 0, 0, 0 +}; // Map BasicType to Java type name const char* type2name_tab[T_CONFLICT+1] = { diff -r ae0af9fb3dbb -r cba8afa5cfed src/hotspot/share/utilities/globalDefinitions.hpp --- a/src/hotspot/share/utilities/globalDefinitions.hpp Mon Oct 21 09:26:14 2019 -0700 +++ b/src/hotspot/share/utilities/globalDefinitions.hpp Mon Oct 21 13:13:16 2019 -0400 @@ -29,6 +29,9 @@ #include "utilities/debug.hpp" #include "utilities/macros.hpp" +// Get constants like JVM_T_CHAR and JVM_SIGNATURE_INT, before pulling in . +#include "classfile_constants.h" + #include COMPILER_HEADER(utilities/globalDefinitions) // Defaults for macros that might be defined per compiler. @@ -570,14 +573,22 @@ // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java enum BasicType { - T_BOOLEAN = 4, - T_CHAR = 5, - T_FLOAT = 6, - T_DOUBLE = 7, - T_BYTE = 8, - T_SHORT = 9, - T_INT = 10, - T_LONG = 11, +// The values T_BOOLEAN..T_LONG (4..11) are derived from the JVMS. + T_BOOLEAN = JVM_T_BOOLEAN, + T_CHAR = JVM_T_CHAR, + T_FLOAT = JVM_T_FLOAT, + T_DOUBLE = JVM_T_DOUBLE, + T_BYTE = JVM_T_BYTE, + T_SHORT = JVM_T_SHORT, + T_INT = JVM_T_INT, + T_LONG = JVM_T_LONG, + // The remaining values are not part of any standard. + // T_OBJECT and T_VOID denote two more semantic choices + // for method return values. + // T_OBJECT and T_ARRAY describe signature syntax. + // T_ADDRESS, T_METADATA, T_NARROWOOP, T_NARROWKLASS describe + // internal references within the JVM as if they were Java + // types in their own right. T_OBJECT = 12, T_ARRAY = 13, T_VOID = 14, @@ -602,6 +613,10 @@ return (t == T_BYTE || t == T_SHORT); } +inline bool is_double_word_type(BasicType t) { + return (t == T_DOUBLE || t == T_LONG); +} + inline bool is_reference_type(BasicType t) { return (t == T_OBJECT || t == T_ARRAY); } @@ -609,17 +624,17 @@ // Convert a char from a classfile signature to a BasicType inline BasicType char2type(char c) { switch( c ) { - case 'B': return T_BYTE; - case 'C': return T_CHAR; - case 'D': return T_DOUBLE; - case 'F': return T_FLOAT; - case 'I': return T_INT; - case 'J': return T_LONG; - case 'S': return T_SHORT; - case 'Z': return T_BOOLEAN; - case 'V': return T_VOID; - case 'L': return T_OBJECT; - case '[': return T_ARRAY; + case JVM_SIGNATURE_BYTE: return T_BYTE; + case JVM_SIGNATURE_CHAR: return T_CHAR; + case JVM_SIGNATURE_DOUBLE: return T_DOUBLE; + case JVM_SIGNATURE_FLOAT: return T_FLOAT; + case JVM_SIGNATURE_INT: return T_INT; + case JVM_SIGNATURE_LONG: return T_LONG; + case JVM_SIGNATURE_SHORT: return T_SHORT; + case JVM_SIGNATURE_BOOLEAN: return T_BOOLEAN; + case JVM_SIGNATURE_VOID: return T_VOID; + case JVM_SIGNATURE_CLASS: return T_OBJECT; + case JVM_SIGNATURE_ARRAY: return T_ARRAY; } return T_ILLEGAL; } diff -r ae0af9fb3dbb -r cba8afa5cfed src/java.base/share/native/include/classfile_constants.h.template --- a/src/java.base/share/native/include/classfile_constants.h.template Mon Oct 21 09:26:14 2019 -0700 +++ b/src/java.base/share/native/include/classfile_constants.h.template Mon Oct 21 13:13:16 2019 -0400 @@ -144,6 +144,10 @@ /* Type signatures */ enum { + JVM_SIGNATURE_SLASH = '/', + JVM_SIGNATURE_DOT = '.', + JVM_SIGNATURE_SPECIAL = '<', + JVM_SIGNATURE_ENDSPECIAL = '>', JVM_SIGNATURE_ARRAY = '[', JVM_SIGNATURE_BYTE = 'B', JVM_SIGNATURE_CHAR = 'C',