< 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 >