--- old/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp 2020-03-26 15:58:47.000000000 -0700 +++ new/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp 2020-03-26 15:58:47.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020, 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 @@ -189,52 +189,54 @@ * caller needs ResourceMark */ -uintptr_t JfrSymbolId::unsafe_anonymous_klass_name_hash(const InstanceKlass* ik) { +uintptr_t JfrSymbolId::hidden_or_anon_klass_name_hash(const InstanceKlass* ik) { assert(ik != NULL, "invariant"); - assert(ik->is_unsafe_anonymous(), "invariant"); + assert(ik->is_unsafe_anonymous() || ik->is_hidden(), "invariant"); const oop mirror = ik->java_mirror_no_keepalive(); assert(mirror != NULL, "invariant"); return (uintptr_t)mirror->identity_hash(); } -static const char* create_unsafe_anonymous_klass_symbol(const InstanceKlass* ik, uintptr_t hash) { +static const char* create_hidden_or_anon_klass_symbol(const InstanceKlass* ik, uintptr_t hash) { assert(ik != NULL, "invariant"); - assert(ik->is_unsafe_anonymous(), "invariant"); + assert(ik->is_unsafe_anonymous() || ik->is_hidden(), "invariant"); assert(hash != 0, "invariant"); - char* anonymous_symbol = NULL; + char* hidden_or_anon_symbol = NULL; const oop mirror = ik->java_mirror_no_keepalive(); assert(mirror != NULL, "invariant"); char hash_buf[40]; sprintf(hash_buf, "/" UINTX_FORMAT, hash); const size_t hash_len = strlen(hash_buf); const size_t result_len = ik->name()->utf8_length(); - anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); - ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1); - assert(strlen(anonymous_symbol) == result_len, "invariant"); - strcpy(anonymous_symbol + result_len, hash_buf); - assert(strlen(anonymous_symbol) == result_len + hash_len, "invariant"); - return anonymous_symbol; + hidden_or_anon_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); + ik->name()->as_klass_external_name(hidden_or_anon_symbol, (int)result_len + 1); + assert(strlen(hidden_or_anon_symbol) == result_len, "invariant"); + strcpy(hidden_or_anon_symbol + result_len, hash_buf); + assert(strlen(hidden_or_anon_symbol) == result_len + hash_len, "invariant"); + return hidden_or_anon_symbol; } -bool JfrSymbolId::is_unsafe_anonymous_klass(const Klass* k) { +bool JfrSymbolId::is_hidden_or_anon_klass(const Klass* k) { assert(k != NULL, "invariant"); - return k->is_instance_klass() && ((const InstanceKlass*)k)->is_unsafe_anonymous(); + return k->is_instance_klass() && + (((const InstanceKlass*)k)->is_unsafe_anonymous() || + ((const InstanceKlass*)k)->is_hidden()); } -traceid JfrSymbolId::mark_unsafe_anonymous_klass_name(const InstanceKlass* ik, bool leakp) { +traceid JfrSymbolId::mark_hidden_or_anon_klass_name(const InstanceKlass* ik, bool leakp) { assert(ik != NULL, "invariant"); - assert(ik->is_unsafe_anonymous(), "invariant"); - const uintptr_t hash = unsafe_anonymous_klass_name_hash(ik); - const char* const anonymous_klass_symbol = create_unsafe_anonymous_klass_symbol(ik, hash); - return mark(hash, anonymous_klass_symbol, leakp); + assert(ik->is_unsafe_anonymous() || ik->is_hidden(), "invariant"); + const uintptr_t hash = hidden_or_anon_klass_name_hash(ik); + const char* const hidden_or_anon_symbol = create_hidden_or_anon_klass_symbol(ik, hash); + return mark(hash, hidden_or_anon_symbol, leakp); } traceid JfrSymbolId::mark(const Klass* k, bool leakp) { assert(k != NULL, "invariant"); traceid symbol_id = 0; - if (is_unsafe_anonymous_klass(k)) { + if (is_hidden_or_anon_klass(k)) { assert(k->is_instance_klass(), "invariant"); - symbol_id = mark_unsafe_anonymous_klass_name((const InstanceKlass*)k, leakp); + symbol_id = mark_hidden_or_anon_klass_name((const InstanceKlass*)k, leakp); } if (0 == symbol_id) { Symbol* const sym = k->name(); @@ -276,9 +278,9 @@ return _symbol_id->bootstrap_name(leakp); } -traceid JfrArtifactSet::mark_unsafe_anonymous_klass_name(const Klass* klass, bool leakp) { +traceid JfrArtifactSet::mark_hidden_or_anon_klass_name(const Klass* klass, bool leakp) { assert(klass->is_instance_klass(), "invariant"); - return _symbol_id->mark_unsafe_anonymous_klass_name((const InstanceKlass*)klass, leakp); + return _symbol_id->mark_hidden_or_anon_klass_name((const InstanceKlass*)klass, leakp); } traceid JfrArtifactSet::mark(uintptr_t hash, const Symbol* sym, bool leakp) {