|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
4 | 4 | *
|
5 | 5 | * This code is free software; you can redistribute it and/or modify it
|
|
23 | 23 | */
|
24 | 24 |
|
25 | 25 | #include "precompiled.hpp"
|
26 |
| -#include "classfile/javaClasses.inline.hpp" |
27 | 26 | #include "classfile/classLoaderData.hpp"
|
| 27 | +#include "classfile/javaClasses.hpp" |
28 | 28 | #include "jfr/support/jfrSymbolTable.hpp"
|
29 |
| -#include "oops/instanceKlass.hpp" |
30 |
| -#include "oops/oop.inline.hpp" |
| 29 | +#include "oops/klass.hpp" |
31 | 30 | #include "oops/symbol.hpp"
|
32 | 31 | #include "runtime/mutexLocker.hpp"
|
33 | 32 |
|
@@ -200,7 +199,7 @@ traceid JfrSymbolTable::bootstrap_name(bool leakp) {
|
200 | 199 |
|
201 | 200 | traceid JfrSymbolTable::mark(const Symbol* sym, bool leakp /* false */) {
|
202 | 201 | assert(sym != nullptr, "invariant");
|
203 |
| - return mark((uintptr_t)sym->identity_hash(), sym, leakp); |
| 202 | + return mark(sym->identity_hash(), sym, leakp); |
204 | 203 | }
|
205 | 204 |
|
206 | 205 | traceid JfrSymbolTable::mark(uintptr_t hash, const Symbol* sym, bool leakp) {
|
@@ -236,59 +235,25 @@ traceid JfrSymbolTable::mark(uintptr_t hash, const char* str, bool leakp) {
|
236 | 235 | }
|
237 | 236 |
|
238 | 237 | /*
|
239 |
| -* hidden classes symbol is the external name + |
240 |
| -* the address of its InstanceKlass slash appended: |
241 |
| -* java.lang.invoke.LambdaForm$BMH/22626602 |
242 |
| -* |
243 |
| -* caller needs ResourceMark |
244 |
| -*/ |
245 |
| - |
246 |
| -uintptr_t JfrSymbolTable::hidden_klass_name_hash(const InstanceKlass* ik) { |
247 |
| - assert(ik != nullptr, "invariant"); |
248 |
| - assert(ik->is_hidden(), "invariant"); |
249 |
| - const oop mirror = ik->java_mirror_no_keepalive(); |
250 |
| - assert(mirror != nullptr, "invariant"); |
251 |
| - return (uintptr_t)mirror->identity_hash(); |
252 |
| -} |
253 |
| - |
254 |
| -static const char* create_hidden_klass_symbol(const InstanceKlass* ik, uintptr_t hash) { |
255 |
| - assert(ik != nullptr, "invariant"); |
256 |
| - assert(ik->is_hidden(), "invariant"); |
257 |
| - assert(hash != 0, "invariant"); |
258 |
| - char* hidden_symbol = nullptr; |
259 |
| - const oop mirror = ik->java_mirror_no_keepalive(); |
260 |
| - assert(mirror != nullptr, "invariant"); |
261 |
| - char hash_buf[40]; |
262 |
| - os::snprintf_checked(hash_buf, sizeof(hash_buf), "/" UINTX_FORMAT, hash); |
263 |
| - const size_t hash_len = strlen(hash_buf); |
264 |
| - const size_t result_len = ik->name()->utf8_length(); |
265 |
| - hidden_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); |
266 |
| - ik->name()->as_klass_external_name(hidden_symbol, (int)result_len + 1); |
267 |
| - assert(strlen(hidden_symbol) == result_len, "invariant"); |
268 |
| - strcpy(hidden_symbol + result_len, hash_buf); |
269 |
| - assert(strlen(hidden_symbol) == result_len + hash_len, "invariant"); |
270 |
| - return hidden_symbol; |
271 |
| -} |
272 |
| - |
273 |
| -bool JfrSymbolTable::is_hidden_klass(const Klass* k) { |
| 238 | + * The hidden class symbol is the external name with the |
| 239 | + * address of its Klass slash appended. |
| 240 | + * |
| 241 | + * "java.lang.invoke.LambdaForm$DMH/0x0000000037144c00" |
| 242 | + * |
| 243 | + * Caller needs ResourceMark. |
| 244 | + */ |
| 245 | +traceid JfrSymbolTable::mark_hidden_klass_name(const Klass* k, bool leakp) { |
274 | 246 | assert(k != nullptr, "invariant");
|
275 |
| - return k->is_instance_klass() && ((const InstanceKlass*)k)->is_hidden(); |
276 |
| -} |
277 |
| - |
278 |
| -traceid JfrSymbolTable::mark_hidden_klass_name(const InstanceKlass* ik, bool leakp) { |
279 |
| - assert(ik != nullptr, "invariant"); |
280 |
| - assert(ik->is_hidden(), "invariant"); |
281 |
| - const uintptr_t hash = hidden_klass_name_hash(ik); |
282 |
| - const char* const hidden_symbol = create_hidden_klass_symbol(ik, hash); |
283 |
| - return mark(hash, hidden_symbol, leakp); |
| 247 | + assert(k->is_hidden(), "invariant"); |
| 248 | + const uintptr_t hash = k->name()->identity_hash(); |
| 249 | + return mark(hash, k->external_name(), leakp); |
284 | 250 | }
|
285 | 251 |
|
286 | 252 | traceid JfrSymbolTable::mark(const Klass* k, bool leakp) {
|
287 | 253 | assert(k != nullptr, "invariant");
|
288 | 254 | traceid symbol_id = 0;
|
289 |
| - if (is_hidden_klass(k)) { |
290 |
| - assert(k->is_instance_klass(), "invariant"); |
291 |
| - symbol_id = mark_hidden_klass_name((const InstanceKlass*)k, leakp); |
| 255 | + if (k->is_hidden()) { |
| 256 | + symbol_id = mark_hidden_klass_name(k, leakp); |
292 | 257 | } else {
|
293 | 258 | Symbol* const sym = k->name();
|
294 | 259 | if (sym != nullptr) {
|
|
0 commit comments