Skip to content

Commit 80dac5a

Browse files
committed
8257912: Convert enum iteration to use range-based for loops
Reviewed-by: kbarrett, tschatzl, gziemski
1 parent 164c55b commit 80dac5a

File tree

10 files changed

+95
-48
lines changed

10 files changed

+95
-48
lines changed

src/hotspot/share/ci/ciObjectFactory.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,15 @@ void ciObjectFactory::init_shared_objects() {
122122

123123
{
124124
// Create the shared symbols, but not in _shared_ci_metadata.
125-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
126-
vmSymbolID index = *it;
125+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
127126
Symbol* vmsym = vmSymbols::symbol_at(index);
128127
assert(vmSymbols::find_sid(vmsym) == index, "1-1 mapping");
129128
ciSymbol* sym = new (_arena) ciSymbol(vmsym, index);
130129
init_ident_of(sym);
131130
_shared_ci_symbols[vmSymbols::as_int(index)] = sym;
132131
}
133132
#ifdef ASSERT
134-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
135-
vmSymbolID index = *it;
133+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
136134
Symbol* vmsym = vmSymbols::symbol_at(index);
137135
ciSymbol* sym = vm_symbol_at(index);
138136
assert(sym->get_symbol() == vmsym, "oop must match");

src/hotspot/share/classfile/classFileParser.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5302,8 +5302,7 @@ static void check_methods_for_intrinsics(const InstanceKlass* ik,
53025302
// The check is potentially expensive, therefore it is available
53035303
// only in debug builds.
53045304

5305-
for (vmIntrinsicsIterator it = vmIntrinsicsRange.begin(); it != vmIntrinsicsRange.end(); ++it) {
5306-
vmIntrinsicID id = *it;
5305+
for (vmIntrinsicID id : EnumRange<vmIntrinsicID>{}) {
53075306
if (vmIntrinsics::_compiledLambdaForm == id) {
53085307
// The _compiledLamdbdaForm intrinsic is a special marker for bytecode
53095308
// generated for the JVM from a LambdaForm and therefore no method

src/hotspot/share/classfile/vmIntrinsics.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,7 @@ void vmIntrinsics::init_vm_intrinsic_name_table() {
574574
const char** nt = &vm_intrinsic_name_table[0];
575575
char* string = (char*) &vm_intrinsic_name_bodies[0];
576576

577-
for (vmIntrinsicsIterator it = vmIntrinsicsRange.begin(); it != vmIntrinsicsRange.end(); ++it) {
578-
vmIntrinsicID index = *it;
577+
for (vmIntrinsicID index : EnumRange<vmIntrinsicID>{}) {
579578
nt[as_int(index)] = string;
580579
string += strlen(string); // skip string body
581580
string += 1; // skip trailing null
@@ -602,8 +601,7 @@ vmIntrinsics::ID vmIntrinsics::find_id(const char* name) {
602601
init_vm_intrinsic_name_table();
603602
}
604603

605-
for (vmIntrinsicsIterator it = vmIntrinsicsRange.begin(); it != vmIntrinsicsRange.end(); ++it) {
606-
vmIntrinsicID index = *it;
604+
for (vmIntrinsicID index : EnumRange<vmIntrinsicID>{}) {
607605
if (0 == strcmp(name, nt[as_int(index)])) {
608606
return index;
609607
}

src/hotspot/share/classfile/vmIntrinsics.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,8 +1044,6 @@ enum class vmIntrinsicID : int {
10441044
};
10451045

10461046
ENUMERATOR_RANGE(vmIntrinsicID, vmIntrinsicID::FIRST_ID, vmIntrinsicID::LAST_ID)
1047-
constexpr EnumRange<vmIntrinsicID> vmIntrinsicsRange; // the default range of all valid vmIntrinsicIDs
1048-
using vmIntrinsicsIterator = EnumIterator<vmIntrinsicID>; // convenience
10491047

10501048
class vmIntrinsics : AllStatic {
10511049
friend class vmSymbols;

src/hotspot/share/classfile/vmSymbols.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ void vmSymbols::initialize(TRAPS) {
8383

8484
if (!UseSharedSpaces) {
8585
const char* string = &vm_symbol_bodies[0];
86-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
87-
vmSymbolID index = *it;
86+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
8887
Symbol* sym = SymbolTable::new_permanent_symbol(string);
8988
Symbol::_vm_symbols[as_int(index)] = sym;
9089
string += strlen(string); // skip string body
@@ -113,12 +112,11 @@ void vmSymbols::initialize(TRAPS) {
113112

114113
#ifdef ASSERT
115114
// Check for duplicates:
116-
for (vmSymbolsIterator it1 = vmSymbolsRange.begin(); it1 != vmSymbolsRange.end(); ++it1) {
117-
vmSymbolID i1 = *it1;
115+
116+
for (vmSymbolID i1 : EnumRange<vmSymbolID>{}) {
118117
Symbol* sym = symbol_at(i1);
119-
for (vmSymbolsIterator it2 = vmSymbolsRange.begin(); it2 != it1; ++it2) {
120-
vmSymbolID i2 = *it2;
121-
if (symbol_at(i2) == sym) {
118+
for (vmSymbolID i2 : EnumRange<vmSymbolID>{vmSymbolID::FIRST_SID, i1}) {
119+
if (i2 != i1 && symbol_at(i2) == sym) {
122120
tty->print("*** Duplicate VM symbol SIDs %s(%d) and %s(%d): \"",
123121
vm_symbol_enum_name(i2), as_int(i2),
124122
vm_symbol_enum_name(i1), as_int(i1));
@@ -131,8 +129,7 @@ void vmSymbols::initialize(TRAPS) {
131129

132130
// Create an index for find_id:
133131
{
134-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
135-
vmSymbolID index = *it;
132+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
136133
vm_symbol_index[as_int(index)] = index;
137134
}
138135
int num_sids = SID_LIMIT-FIRST_SID;
@@ -153,8 +150,7 @@ void vmSymbols::initialize(TRAPS) {
153150
assert(symbol_at(sid) == jlo, "");
154151

155152
// Make sure find_sid produces the right answer in each case.
156-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
157-
vmSymbolID index = *it;
153+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
158154
Symbol* sym = symbol_at(index);
159155
sid = find_sid(sym);
160156
assert(sid == index, "symbol index works");
@@ -178,8 +174,7 @@ const char* vmSymbols::name_for(vmSymbolID sid) {
178174
if (sid == vmSymbolID::NO_SID)
179175
return "NO_SID";
180176
const char* string = &vm_symbol_bodies[0];
181-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
182-
vmSymbolID index = *it;
177+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
183178
if (index == sid)
184179
return string;
185180
string += strlen(string); // skip string body
@@ -192,8 +187,7 @@ const char* vmSymbols::name_for(vmSymbolID sid) {
192187

193188

194189
void vmSymbols::symbols_do(SymbolClosure* f) {
195-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
196-
vmSymbolID index = *it;
190+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
197191
f->do_symbol(&Symbol::_vm_symbols[as_int(index)]);
198192
}
199193
for (int i = 0; i < T_VOID+1; i++) {
@@ -202,8 +196,7 @@ void vmSymbols::symbols_do(SymbolClosure* f) {
202196
}
203197

204198
void vmSymbols::metaspace_pointers_do(MetaspaceClosure *closure) {
205-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
206-
vmSymbolID index = *it;
199+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
207200
closure->push(&Symbol::_vm_symbols[as_int(index)]);
208201
}
209202
for (int i = 0; i < T_VOID+1; i++) {
@@ -281,8 +274,7 @@ vmSymbolID vmSymbols::find_sid(const Symbol* symbol) {
281274
// Make sure this is the right answer, using linear search.
282275
// (We have already proven that there are no duplicates in the list.)
283276
vmSymbolID sid2 = vmSymbolID::NO_SID;
284-
for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
285-
vmSymbolID index = *it;
277+
for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
286278
Symbol* sym2 = symbol_at(index);
287279
if (sym2 == symbol) {
288280
sid2 = index;

src/hotspot/share/classfile/vmSymbols.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,8 +722,6 @@ enum class vmSymbolID : int {
722722
};
723723

724724
ENUMERATOR_RANGE(vmSymbolID, vmSymbolID::FIRST_SID, vmSymbolID::LAST_SID)
725-
constexpr EnumRange<vmSymbolID> vmSymbolsRange; // the default range of all valid vmSymbolIDs
726-
using vmSymbolsIterator = EnumIterator<vmSymbolID>; // convenience
727725

728726
class vmSymbols: AllStatic {
729727
friend class vmIntrinsics;

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,10 @@ static const char* flag_value_origin_to_string(JVMFlagOrigin origin) {
138138
}
139139

140140
void FlagValueOriginConstant::serialize(JfrCheckpointWriter& writer) {
141-
constexpr EnumRange<JVMFlagOrigin> range;
141+
constexpr EnumRange<JVMFlagOrigin> range{};
142142
writer.write_count(static_cast<u4>(range.size()));
143143

144-
for (EnumIterator<JVMFlagOrigin> it = range.begin(); it != range.end(); ++it) {
145-
JVMFlagOrigin origin = *it;
144+
for (JVMFlagOrigin origin : range) {
146145
writer.write_key(static_cast<u4>(origin));
147146
writer.write(flag_value_origin_to_string(origin));
148147
}

src/hotspot/share/opto/compile.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,7 @@ void Compile::print_intrinsic_statistics() {
234234
if (total == 0) total = 1; // avoid div0 in case of no successes
235235
#define PRINT_STAT_LINE(name, c, f) \
236236
tty->print_cr(" %4d (%4.1f%%) %s (%s)", (int)(c), ((c) * 100.0) / total, name, f);
237-
for (vmIntrinsicsIterator it = vmIntrinsicsRange.begin(); it != vmIntrinsicsRange.end(); ++it) {
238-
vmIntrinsicID id = *it;
237+
for (vmIntrinsicID id : EnumRange<vmIntrinsicID>{}) {
239238
int flags = _intrinsic_hist_flags[as_int(id)];
240239
juint count = _intrinsic_hist_count[as_int(id)];
241240
if ((flags | count) != 0) {

src/hotspot/share/utilities/enumIterator.hpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,19 @@
5757
// EnumRange -- defines the range of *one specific* iteration loop.
5858
// EnumIterator -- the current point in the iteration loop.
5959

60-
// Example (see vmSymbols.hpp/cpp)
60+
// Example:
6161
//
62-
// ENUMERATOR_RANGE(vmSymbolID, vmSymbolID::FIRST_SID, vmSymbolID::LAST_SID)
63-
// constexpr EnumRange<vmSymbolID> vmSymbolsRange;
64-
// using vmSymbolsIterator = EnumIterator<vmSymbolID>;
62+
// /* With range-base for (recommended) */
63+
// for (vmSymbolID index : EnumRange<vmSymbolID>{}) {
64+
// ....
65+
// }
6566
//
66-
// /* Without range-based for, allowed */
67+
// /* Without range-based for */
68+
// constexpr EnumRange<vmSymbolID> vmSymbolsRange{};
69+
// using vmSymbolsIterator = EnumIterator<vmSymbolID>;
6770
// for (vmSymbolsIterator it = vmSymbolsRange.begin(); it != vmSymbolsRange.end(); ++it) {
6871
// vmSymbolID index = *it; ....
6972
// }
70-
//
71-
// /* With range-base for, not allowed by HotSpot coding style yet */
72-
// for (vmSymbolID index : vmSymbolsRange) {
73-
// ....
74-
// }
7573

7674
// EnumeratorRange is a traits type supporting iteration over the enumerators of T.
7775
// Specializations must provide static const data members named "_start" and "_end".

test/hotspot/gtest/utilities/test_enumIterator.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,71 @@ TEST(TestEnumIterator, implicit_iterator) {
110110
}
111111
EXPECT_EQ(it, range.end());
112112
}
113+
114+
TEST(TestEnumIterator, explict_range_based_for_loop_full) {
115+
int i = explicit_start;
116+
for (ExplicitTest value : EnumRange<ExplicitTest>{}) {
117+
EXPECT_EQ(size_t(i - explicit_start), EnumRange<ExplicitTest>{}.index(value));
118+
EXPECT_TRUE(value == ExplicitTest::value1 ||
119+
value == ExplicitTest::value2 ||
120+
value == ExplicitTest::value3);
121+
++i;
122+
}
123+
}
124+
125+
TEST(TestEnumIterator, explict_range_based_for_loop_start) {
126+
constexpr EnumRange<ExplicitTest> range{ExplicitTest::value2};
127+
int start = explicit_start + 2;
128+
int i = start;
129+
for (ExplicitTest value : range) {
130+
EXPECT_EQ(size_t(i - start), range.index(value));
131+
EXPECT_TRUE(value == ExplicitTest::value2 || value == ExplicitTest::value3);
132+
EXPECT_TRUE(value != ExplicitTest::value1);
133+
++i;
134+
}
135+
}
136+
137+
TEST(TestEnumIterator, explict_range_based_for_loop_start_end) {
138+
constexpr EnumRange<ExplicitTest> range{ExplicitTest::value1, ExplicitTest::value2};
139+
int start = explicit_start + 1;
140+
int i = start;
141+
for (ExplicitTest value : range) {
142+
EXPECT_EQ(size_t(i - start), range.index(value));
143+
EXPECT_TRUE(value == ExplicitTest::value1 || value == ExplicitTest::value2);
144+
EXPECT_TRUE(value != ExplicitTest::value3);
145+
++i;
146+
}
147+
}
148+
149+
TEST(TestEnumIterator, implicit_range_based_for_loop) {
150+
int i = implicit_start;
151+
for (ImplicitTest value : EnumRange<ImplicitTest>{}) {
152+
EXPECT_EQ(size_t(i - implicit_start), EnumRange<ImplicitTest>{}.index(value));
153+
++i;
154+
}
155+
}
156+
157+
TEST(TestEnumIterator, implicit_range_based_for_loop_start) {
158+
int start = implicit_start + 1;
159+
EnumRange<ImplicitTest> range{static_cast<ImplicitTest>(start)};
160+
int i = start;
161+
for (ImplicitTest value : range) {
162+
EXPECT_EQ(size_t(i - start), range.index(value));
163+
int iv = static_cast<int>(value);
164+
EXPECT_TRUE(start <= iv && iv <= implicit_end);
165+
++i;
166+
}
167+
}
168+
169+
TEST(TestEnumIterator, implicit_range_based_for_loop_start_end) {
170+
int start = implicit_start + 1;
171+
int end = implicit_end - 1;
172+
EnumRange<ImplicitTest> range{static_cast<ImplicitTest>(start), static_cast<ImplicitTest>(end)};
173+
int i = start;
174+
for (ImplicitTest value : range) {
175+
EXPECT_EQ(size_t(i - start), range.index(value));
176+
int iv = static_cast<int>(value);
177+
EXPECT_TRUE(start <= iv && iv <= end);
178+
++i;
179+
}
180+
}

0 commit comments

Comments
 (0)