Skip to content

Commit 2961b7e

Browse files
albertnetymkstefank
andcommitted
8285364: Remove REF_ enum for java.lang.ref.Reference
Co-authored-by: Stefan Karlsson <stefank@openjdk.org> Reviewed-by: kbarrett, coleenp, stefank
1 parent 167ce4d commit 2961b7e

14 files changed

+84
-45
lines changed

src/hotspot/share/classfile/classFileParser.cpp

+27-5
Original file line numberDiff line numberDiff line change
@@ -5577,7 +5577,6 @@ ClassFileParser::ClassFileParser(ClassFileStream* stream,
55775577
_vtable_size(0),
55785578
_itable_size(0),
55795579
_num_miranda_methods(0),
5580-
_rt(REF_NONE),
55815580
_protection_domain(cl_info->protection_domain()),
55825581
_access_flags(),
55835582
_pub_level(pub_level),
@@ -6058,10 +6057,6 @@ void ClassFileParser::post_process_parsed_stream(const ClassFileStream* const st
60586057
FieldLayoutBuilder lb(class_name(), super_klass(), _cp, _fields,
60596058
_parsed_annotations->is_contended(), _field_info);
60606059
lb.build_layout();
6061-
6062-
// Compute reference typ
6063-
_rt = (NULL ==_super_klass) ? REF_NONE : _super_klass->reference_type();
6064-
60656060
}
60666061

60676062
void ClassFileParser::set_klass(InstanceKlass* klass) {
@@ -6093,6 +6088,33 @@ const ClassFileStream* ClassFileParser::clone_stream() const {
60936088

60946089
return _stream->clone();
60956090
}
6091+
6092+
ReferenceType ClassFileParser::super_reference_type() const {
6093+
return _super_klass == NULL ? REF_NONE : _super_klass->reference_type();
6094+
}
6095+
6096+
bool ClassFileParser::is_instance_ref_klass() const {
6097+
// Only the subclasses of j.l.r.Reference are InstanceRefKlass.
6098+
// j.l.r.Reference itself is InstanceKlass because InstanceRefKlass denotes a
6099+
// klass requiring special treatment in ref-processing. The abstract
6100+
// j.l.r.Reference cannot be instantiated so doesn't partake in
6101+
// ref-processing.
6102+
return is_java_lang_ref_Reference_subclass();
6103+
}
6104+
6105+
bool ClassFileParser::is_java_lang_ref_Reference_subclass() const {
6106+
if (_super_klass == NULL) {
6107+
return false;
6108+
}
6109+
6110+
if (_super_klass->name() == vmSymbols::java_lang_ref_Reference()) {
6111+
// Direct subclass of j.l.r.Reference: Soft|Weak|Final|Phantom
6112+
return true;
6113+
}
6114+
6115+
return _super_klass->reference_type() != REF_NONE;
6116+
}
6117+
60966118
// ----------------------------------------------------------------------------
60976119
// debugging
60986120

src/hotspot/share/classfile/classFileParser.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ class ClassFileParser {
154154

155155
int _num_miranda_methods;
156156

157-
ReferenceType _rt;
158157
Handle _protection_domain;
159158
AccessFlags _access_flags;
160159

@@ -561,7 +560,10 @@ class ClassFileParser {
561560
const Symbol* class_name() const { return _class_name; }
562561
const InstanceKlass* super_klass() const { return _super_klass; }
563562

564-
ReferenceType reference_type() const { return _rt; }
563+
ReferenceType super_reference_type() const;
564+
bool is_instance_ref_klass() const;
565+
bool is_java_lang_ref_Reference_subclass() const;
566+
565567
AccessFlags access_flags() const { return _access_flags; }
566568

567569
bool is_internal() const { return INTERNAL == _pub_level; }

src/hotspot/share/classfile/vmClasses.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void vmClasses::resolve_all(TRAPS) {
168168

169169
if (UseSharedSpaces) {
170170
// These should already have been initialized during CDS dump.
171-
assert(vmClasses::Reference_klass()->reference_type() == REF_OTHER, "sanity");
171+
assert(vmClasses::Reference_klass()->reference_type() == REF_NONE, "sanity");
172172
assert(vmClasses::SoftReference_klass()->reference_type() == REF_SOFT, "sanity");
173173
assert(vmClasses::WeakReference_klass()->reference_type() == REF_WEAK, "sanity");
174174
assert(vmClasses::FinalReference_klass()->reference_type() == REF_FINAL, "sanity");
@@ -186,14 +186,9 @@ void vmClasses::resolve_all(TRAPS) {
186186
java_lang_ref_Reference::compute_offsets();
187187

188188
// Preload ref klasses and set reference types
189-
vmClasses::Reference_klass()->set_reference_type(REF_OTHER);
190189
InstanceRefKlass::update_nonstatic_oop_maps(vmClasses::Reference_klass());
191190

192191
resolve_through(VM_CLASS_ID(PhantomReference_klass), scan, CHECK);
193-
vmClasses::SoftReference_klass()->set_reference_type(REF_SOFT);
194-
vmClasses::WeakReference_klass()->set_reference_type(REF_WEAK);
195-
vmClasses::FinalReference_klass()->set_reference_type(REF_FINAL);
196-
vmClasses::PhantomReference_klass()->set_reference_type(REF_PHANTOM);
197192
}
198193

199194
resolve_until(vmClassID::LIMIT, scan, CHECK);

src/hotspot/share/gc/shared/referenceProcessor.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,6 @@ size_t ReferenceProcessor::total_reference_count(ReferenceType type) const {
437437
case REF_PHANTOM:
438438
list = _discoveredPhantomRefs;
439439
break;
440-
case REF_OTHER:
441440
case REF_NONE:
442441
default:
443442
ShouldNotReachHere();
@@ -840,8 +839,6 @@ inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt)
840839
case REF_PHANTOM:
841840
list = &_discoveredPhantomRefs[id];
842841
break;
843-
case REF_OTHER:
844-
// Unknown reference type, impossible
845842
case REF_NONE:
846843
// we should not reach here if we are an InstanceRefKlass
847844
default:

src/hotspot/share/gc/shared/referenceProcessor.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ class ReferenceProcessor : public ReferenceDiscoverer {
293293
_current_soft_ref_policy->setup(); // snapshot the policy threshold
294294
}
295295
public:
296-
static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); }
296+
static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_NONE); }
297297

298298
uint num_queues() const { return _num_queues; }
299299
uint max_num_queues() const { return _max_num_queues; }

src/hotspot/share/gc/shared/referenceProcessorPhaseTimes.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static const char* PhaseNames[ReferenceProcessor::RefPhaseMax] = {
7373
};
7474

7575
static const char* ReferenceTypeNames[REF_PHANTOM + 1] = {
76-
"None", "Other", "SoftReference", "WeakReference", "FinalReference", "PhantomReference"
76+
"None", "SoftReference", "WeakReference", "FinalReference", "PhantomReference"
7777
};
7878

7979
STATIC_ASSERT((REF_PHANTOM + 1) == ARRAY_SIZE(ReferenceTypeNames));

src/hotspot/share/gc/shared/referenceProcessorPhaseTimes.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class GCTimer;
3737
class LogStream;
3838

3939
class ReferenceProcessorPhaseTimes : public CHeapObj<mtGC> {
40-
static const int number_of_subclasses_of_ref = REF_PHANTOM - REF_OTHER; // 5 - 1 = 4
40+
static const int number_of_subclasses_of_ref = REF_PHANTOM - REF_NONE; // 4 - 0 = 4
4141

4242
// Records per thread time information of each sub phase.
4343
WorkerDataArray<double>* _sub_phases_worker_time_sec[ReferenceProcessor::RefSubPhaseMax];

src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ void MetaspaceObjectTypeConstant::serialize(JfrCheckpointWriter& writer) {
219219
static const char* reference_type_to_string(ReferenceType rt) {
220220
switch (rt) {
221221
case REF_NONE: return "None reference";
222-
case REF_OTHER: return "Other reference";
223222
case REF_SOFT: return "Soft reference";
224223
case REF_WEAK: return "Weak reference";
225224
case REF_FINAL: return "Final reference";

src/hotspot/share/memory/referenceType.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131

3232
enum ReferenceType {
3333
REF_NONE, // Regular class
34-
REF_OTHER, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
3534
REF_SOFT, // Subclass of java/lang/ref/SoftReference
3635
REF_WEAK, // Subclass of java/lang/ref/WeakReference
3736
REF_FINAL, // Subclass of java/lang/ref/FinalReference

src/hotspot/share/oops/instanceKlass.cpp

+15-17
Original file line numberDiff line numberDiff line change
@@ -446,23 +446,21 @@ InstanceKlass* InstanceKlass::allocate_instance_klass(const ClassFileParser& par
446446
InstanceKlass* ik;
447447

448448
// Allocation
449-
if (REF_NONE == parser.reference_type()) {
450-
if (class_name == vmSymbols::java_lang_Class()) {
451-
// mirror - java.lang.Class
452-
ik = new (loader_data, size, THREAD) InstanceMirrorKlass(parser);
453-
} else if (is_stack_chunk_class(class_name, loader_data)) {
454-
// stack chunk
455-
ik = new (loader_data, size, THREAD) InstanceStackChunkKlass(parser);
456-
} else if (is_class_loader(class_name, parser)) {
457-
// class loader - java.lang.ClassLoader
458-
ik = new (loader_data, size, THREAD) InstanceClassLoaderKlass(parser);
459-
} else {
460-
// normal
461-
ik = new (loader_data, size, THREAD) InstanceKlass(parser);
462-
}
463-
} else {
449+
if (parser.is_instance_ref_klass()) {
464450
// java.lang.ref.Reference
465451
ik = new (loader_data, size, THREAD) InstanceRefKlass(parser);
452+
} else if (class_name == vmSymbols::java_lang_Class()) {
453+
// mirror - java.lang.Class
454+
ik = new (loader_data, size, THREAD) InstanceMirrorKlass(parser);
455+
} else if (is_stack_chunk_class(class_name, loader_data)) {
456+
// stack chunk
457+
ik = new (loader_data, size, THREAD) InstanceStackChunkKlass(parser);
458+
} else if (is_class_loader(class_name, parser)) {
459+
// class loader - java.lang.ClassLoader
460+
ik = new (loader_data, size, THREAD) InstanceClassLoaderKlass(parser);
461+
} else {
462+
// normal
463+
ik = new (loader_data, size, THREAD) InstanceKlass(parser);
466464
}
467465

468466
// Check for pending exception before adding to the loader data and incrementing
@@ -500,7 +498,7 @@ static Monitor* create_init_monitor(const char* name) {
500498
return new Monitor(Mutex::safepoint, name);
501499
}
502500

503-
InstanceKlass::InstanceKlass(const ClassFileParser& parser, KlassKind kind) :
501+
InstanceKlass::InstanceKlass(const ClassFileParser& parser, KlassKind kind, ReferenceType reference_type) :
504502
Klass(kind),
505503
_nest_members(NULL),
506504
_nest_host(NULL),
@@ -511,7 +509,7 @@ InstanceKlass::InstanceKlass(const ClassFileParser& parser, KlassKind kind) :
511509
_itable_len(parser.itable_size()),
512510
_nest_host_index(0),
513511
_init_state(allocated),
514-
_reference_type(parser.reference_type()),
512+
_reference_type(reference_type),
515513
_init_monitor(create_init_monitor("InstanceKlassInitMonitor_lock")),
516514
_init_thread(NULL)
517515
{

src/hotspot/share/oops/instanceKlass.hpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class InstanceKlass: public Klass {
136136
static const KlassKind Kind = InstanceKlassKind;
137137

138138
protected:
139-
InstanceKlass(const ClassFileParser& parser, KlassKind kind = Kind);
139+
InstanceKlass(const ClassFileParser& parser, KlassKind kind = Kind, ReferenceType reference_type = REF_NONE);
140140

141141
public:
142142
InstanceKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
@@ -592,10 +592,6 @@ class InstanceKlass: public Klass {
592592

593593
// reference type
594594
ReferenceType reference_type() const { return (ReferenceType)_reference_type; }
595-
void set_reference_type(ReferenceType t) {
596-
assert(t == (u1)t, "overflow");
597-
_reference_type = (u1)t;
598-
}
599595

600596
// this class cp index
601597
u2 this_class_index() const { return _this_class_index; }

src/hotspot/share/oops/instanceRefKlass.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,43 @@
2323
*/
2424

2525
#include "precompiled.hpp"
26+
#include "classfile/classFileParser.hpp"
2627
#include "classfile/javaClasses.hpp"
2728
#include "classfile/vmClasses.hpp"
29+
#include "classfile/vmSymbols.hpp"
2830
#include "oops/instanceRefKlass.inline.hpp"
2931
#include "oops/oop.inline.hpp"
3032

33+
static ReferenceType reference_subclass_name_to_type(const Symbol* name) {
34+
if ( name == vmSymbols::java_lang_ref_SoftReference()) {
35+
return REF_SOFT;
36+
} else if (name == vmSymbols::java_lang_ref_WeakReference()) {
37+
return REF_WEAK;
38+
} else if (name == vmSymbols::java_lang_ref_FinalReference()) {
39+
return REF_FINAL;
40+
} else if (name == vmSymbols::java_lang_ref_PhantomReference()) {
41+
return REF_PHANTOM;
42+
} else {
43+
ShouldNotReachHere();
44+
return REF_NONE;
45+
}
46+
}
47+
48+
static ReferenceType determine_reference_type(const ClassFileParser& parser) {
49+
const ReferenceType rt = parser.super_reference_type();
50+
if (rt != REF_NONE) {
51+
// Inherit type from super class
52+
return rt;
53+
}
54+
55+
// Bootstrapping: this is one of the direct subclasses of java.lang.ref.Reference
56+
const Symbol* const name = parser.class_name();
57+
return reference_subclass_name_to_type(name);
58+
}
59+
60+
InstanceRefKlass::InstanceRefKlass(const ClassFileParser& parser)
61+
: InstanceKlass(parser, Kind, determine_reference_type(parser)) {}
62+
3163
void InstanceRefKlass::update_nonstatic_oop_maps(Klass* k) {
3264
// Clear the nonstatic oop-map entries corresponding to referent
3365
// and discovered fields. They are treated specially by the

src/hotspot/share/oops/instanceRefKlass.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class InstanceRefKlass: public InstanceKlass {
5353
static const KlassKind Kind = InstanceRefKlassKind;
5454

5555
private:
56-
InstanceRefKlass(const ClassFileParser& parser) : InstanceKlass(parser, Kind) {}
56+
InstanceRefKlass(const ClassFileParser& parser);
5757

5858
public:
5959
InstanceRefKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/ReferenceType.java

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
public enum ReferenceType {
3030
REF_NONE ("None reference"), // Regular class
31-
REF_OTHER ("Other reference"), // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
3231
REF_SOFT ("Soft reference"), // Subclass of java/lang/ref/SoftReference
3332
REF_WEAK ("Weak reference"), // Subclass of java/lang/ref/WeakReference
3433
REF_FINAL ("Final reference"), // Subclass of java/lang/ref/FinalReference

0 commit comments

Comments
 (0)