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