57 JfrSymbolId::~JfrSymbolId() { |
57 JfrSymbolId::~JfrSymbolId() { |
58 delete _sym_table; |
58 delete _sym_table; |
59 delete _cstring_table; |
59 delete _cstring_table; |
60 } |
60 } |
61 |
61 |
62 traceid JfrSymbolId::mark_anonymous_klass_name(const Klass* k) { |
62 traceid JfrSymbolId::mark_unsafe_anonymous_klass_name(const Klass* k) { |
63 assert(k != NULL, "invariant"); |
63 assert(k != NULL, "invariant"); |
64 assert(k->is_instance_klass(), "invariant"); |
64 assert(k->is_instance_klass(), "invariant"); |
65 assert(is_anonymous_klass(k), "invariant"); |
65 assert(is_unsafe_anonymous_klass(k), "invariant"); |
66 |
66 |
67 uintptr_t anonymous_symbol_hash_code = 0; |
67 uintptr_t anonymous_symbol_hash_code = 0; |
68 const char* const anonymous_symbol = |
68 const char* const anonymous_symbol = |
69 create_anonymous_klass_symbol((const InstanceKlass*)k, anonymous_symbol_hash_code); |
69 create_unsafe_anonymous_klass_symbol((const InstanceKlass*)k, anonymous_symbol_hash_code); |
70 |
70 |
71 if (anonymous_symbol == NULL) { |
71 if (anonymous_symbol == NULL) { |
72 return 0; |
72 return 0; |
73 } |
73 } |
74 |
74 |
117 } |
117 } |
118 |
118 |
119 traceid JfrSymbolId::mark(const Klass* k) { |
119 traceid JfrSymbolId::mark(const Klass* k) { |
120 assert(k != NULL, "invariant"); |
120 assert(k != NULL, "invariant"); |
121 traceid symbol_id = 0; |
121 traceid symbol_id = 0; |
122 if (is_anonymous_klass(k)) { |
122 if (is_unsafe_anonymous_klass(k)) { |
123 symbol_id = mark_anonymous_klass_name(k); |
123 symbol_id = mark_unsafe_anonymous_klass_name(k); |
124 } |
124 } |
125 if (0 == symbol_id) { |
125 if (0 == symbol_id) { |
126 const Symbol* const sym = k->name(); |
126 const Symbol* const sym = k->name(); |
127 if (sym != NULL) { |
127 if (sym != NULL) { |
128 symbol_id = mark(sym); |
128 symbol_id = mark(sym); |
146 traceid JfrSymbolId::mark(const char* str, uintptr_t hash) { |
146 traceid JfrSymbolId::mark(const char* str, uintptr_t hash) { |
147 assert(str != NULL, "invariant"); |
147 assert(str != NULL, "invariant"); |
148 return _cstring_table->id(str, hash); |
148 return _cstring_table->id(str, hash); |
149 } |
149 } |
150 |
150 |
151 bool JfrSymbolId::is_anonymous_klass(const Klass* k) { |
151 bool JfrSymbolId::is_unsafe_anonymous_klass(const Klass* k) { |
152 assert(k != NULL, "invariant"); |
152 assert(k != NULL, "invariant"); |
153 return k->is_instance_klass() && ((const InstanceKlass*)k)->is_anonymous(); |
153 return k->is_instance_klass() && ((const InstanceKlass*)k)->is_unsafe_anonymous(); |
154 } |
154 } |
155 |
155 |
156 /* |
156 /* |
157 * jsr292 anonymous classes symbol is the external name + |
157 * jsr292 anonymous classes symbol is the external name + |
158 * the identity_hashcode slash appended: |
158 * the identity_hashcode slash appended: |
159 * java.lang.invoke.LambdaForm$BMH/22626602 |
159 * java.lang.invoke.LambdaForm$BMH/22626602 |
160 * |
160 * |
161 * caller needs ResourceMark |
161 * caller needs ResourceMark |
162 */ |
162 */ |
163 |
163 |
164 uintptr_t JfrSymbolId::anonymous_klass_name_hash_code(const InstanceKlass* ik) { |
164 uintptr_t JfrSymbolId::unsafe_anonymous_klass_name_hash_code(const InstanceKlass* ik) { |
165 assert(ik != NULL, "invariant"); |
165 assert(ik != NULL, "invariant"); |
166 assert(ik->is_anonymous(), "invariant"); |
166 assert(ik->is_unsafe_anonymous(), "invariant"); |
167 const oop mirror = ik->java_mirror(); |
167 const oop mirror = ik->java_mirror(); |
168 assert(mirror != NULL, "invariant"); |
168 assert(mirror != NULL, "invariant"); |
169 return (uintptr_t)mirror->identity_hash(); |
169 return (uintptr_t)mirror->identity_hash(); |
170 } |
170 } |
171 |
171 |
172 const char* JfrSymbolId::create_anonymous_klass_symbol(const InstanceKlass* ik, uintptr_t& hashcode) { |
172 const char* JfrSymbolId::create_unsafe_anonymous_klass_symbol(const InstanceKlass* ik, uintptr_t& hashcode) { |
173 assert(ik != NULL, "invariant"); |
173 assert(ik != NULL, "invariant"); |
174 assert(ik->is_anonymous(), "invariant"); |
174 assert(ik->is_unsafe_anonymous(), "invariant"); |
175 assert(0 == hashcode, "invariant"); |
175 assert(0 == hashcode, "invariant"); |
176 char* anonymous_symbol = NULL; |
176 char* anonymous_symbol = NULL; |
177 const oop mirror = ik->java_mirror(); |
177 const oop mirror = ik->java_mirror(); |
178 assert(mirror != NULL, "invariant"); |
178 assert(mirror != NULL, "invariant"); |
179 char hash_buf[40]; |
179 char hash_buf[40]; |
180 hashcode = anonymous_klass_name_hash_code(ik); |
180 hashcode = unsafe_anonymous_klass_name_hash_code(ik); |
181 sprintf(hash_buf, "/" UINTX_FORMAT, hashcode); |
181 sprintf(hash_buf, "/" UINTX_FORMAT, hashcode); |
182 const size_t hash_len = strlen(hash_buf); |
182 const size_t hash_len = strlen(hash_buf); |
183 const size_t result_len = ik->name()->utf8_length(); |
183 const size_t result_len = ik->name()->utf8_length(); |
184 anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); |
184 anonymous_symbol = NEW_RESOURCE_ARRAY(char, result_len + hash_len + 1); |
185 ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1); |
185 ik->name()->as_klass_external_name(anonymous_symbol, (int)result_len + 1); |