< prev index next >
src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetUtils.cpp
Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com
@@ -1,7 +1,7 @@
/*
- * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -187,56 +187,58 @@
* java.lang.invoke.LambdaForm$BMH/22626602
*
* 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();
if (sym != NULL) {
symbol_id = mark(sym, leakp);
@@ -274,13 +276,13 @@
traceid JfrArtifactSet::bootstrap_name(bool leakp) {
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) {
return _symbol_id->mark(hash, sym, leakp);
}
< prev index next >