< 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 ****
/*
! * Copyright (c) 2017, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * 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,242 ****
* java.lang.invoke.LambdaForm$BMH/22626602
*
* caller needs ResourceMark
*/
! uintptr_t JfrSymbolId::unsafe_anonymous_klass_name_hash(const InstanceKlass* ik) {
assert(ik != NULL, "invariant");
! assert(ik->is_unsafe_anonymous(), "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) {
assert(ik != NULL, "invariant");
! assert(ik->is_unsafe_anonymous(), "invariant");
assert(hash != 0, "invariant");
! char* anonymous_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;
}
! bool JfrSymbolId::is_unsafe_anonymous_klass(const Klass* k) {
assert(k != NULL, "invariant");
! return k->is_instance_klass() && ((const InstanceKlass*)k)->is_unsafe_anonymous();
}
! traceid JfrSymbolId::mark_unsafe_anonymous_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);
}
traceid JfrSymbolId::mark(const Klass* k, bool leakp) {
assert(k != NULL, "invariant");
traceid symbol_id = 0;
! if (is_unsafe_anonymous_klass(k)) {
assert(k->is_instance_klass(), "invariant");
! symbol_id = mark_unsafe_anonymous_klass_name((const InstanceKlass*)k, leakp);
}
if (0 == symbol_id) {
Symbol* const sym = k->name();
if (sym != NULL) {
symbol_id = mark(sym, leakp);
--- 187,244 ----
* java.lang.invoke.LambdaForm$BMH/22626602
*
* caller needs ResourceMark
*/
! uintptr_t JfrSymbolId::hidden_or_anon_klass_name_hash(const InstanceKlass* ik) {
assert(ik != NULL, "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_hidden_or_anon_klass_symbol(const InstanceKlass* ik, uintptr_t hash) {
assert(ik != NULL, "invariant");
! assert(ik->is_unsafe_anonymous() || ik->is_hidden(), "invariant");
assert(hash != 0, "invariant");
! 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();
! 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_hidden_or_anon_klass(const Klass* k) {
assert(k != NULL, "invariant");
! return k->is_instance_klass() &&
! (((const InstanceKlass*)k)->is_unsafe_anonymous() ||
! ((const InstanceKlass*)k)->is_hidden());
}
! traceid JfrSymbolId::mark_hidden_or_anon_klass_name(const InstanceKlass* ik, bool leakp) {
assert(ik != NULL, "invariant");
! 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_hidden_or_anon_klass(k)) {
assert(k->is_instance_klass(), "invariant");
! 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,286 ****
traceid JfrArtifactSet::bootstrap_name(bool leakp) {
return _symbol_id->bootstrap_name(leakp);
}
! traceid JfrArtifactSet::mark_unsafe_anonymous_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);
}
traceid JfrArtifactSet::mark(uintptr_t hash, const Symbol* sym, bool leakp) {
return _symbol_id->mark(hash, sym, leakp);
}
--- 276,288 ----
traceid JfrArtifactSet::bootstrap_name(bool leakp) {
return _symbol_id->bootstrap_name(leakp);
}
! traceid JfrArtifactSet::mark_hidden_or_anon_klass_name(const Klass* klass, bool leakp) {
assert(klass->is_instance_klass(), "invariant");
! 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 >