Skip to content

Commit 23180f8

Browse files
author
David Holmes
committed
8266017: Refactor the *klass::array_klass_impl code to separate the non-exception-throwing API
Reviewed-by: coleenp, iklam
1 parent f75dd80 commit 23180f8

File tree

8 files changed

+85
-71
lines changed

8 files changed

+85
-71
lines changed

src/hotspot/share/oops/instanceKlass.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,11 +1427,9 @@ void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
14271427
}
14281428
}
14291429

1430-
Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
1430+
Klass* InstanceKlass::array_klass(int n, TRAPS) {
14311431
// Need load-acquire for lock-free read
14321432
if (array_klasses_acquire() == NULL) {
1433-
if (or_null) return NULL;
1434-
14351433
ResourceMark rm(THREAD);
14361434
JavaThread *jt = THREAD->as_Java_thread();
14371435
{
@@ -1446,16 +1444,27 @@ Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
14461444
}
14471445
}
14481446
}
1449-
// _this will always be set at this point
1447+
// array_klasses() will always be set at this point
14501448
ObjArrayKlass* oak = array_klasses();
1451-
if (or_null) {
1449+
return oak->array_klass(n, THREAD);
1450+
}
1451+
1452+
Klass* InstanceKlass::array_klass_or_null(int n) {
1453+
// Need load-acquire for lock-free read
1454+
ObjArrayKlass* oak = array_klasses_acquire();
1455+
if (oak == NULL) {
1456+
return NULL;
1457+
} else {
14521458
return oak->array_klass_or_null(n);
14531459
}
1454-
return oak->array_klass(n, THREAD);
14551460
}
14561461

1457-
Klass* InstanceKlass::array_klass_impl(bool or_null, TRAPS) {
1458-
return array_klass_impl(or_null, 1, THREAD);
1462+
Klass* InstanceKlass::array_klass(TRAPS) {
1463+
return array_klass(1, THREAD);
1464+
}
1465+
1466+
Klass* InstanceKlass::array_klass_or_null() {
1467+
return array_klass_or_null(1);
14591468
}
14601469

14611470
static int call_class_initializer_counter = 0; // for debugging

src/hotspot/share/oops/instanceKlass.hpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,15 @@ class InstanceKlass: public Klass {
12001200
// cannot lock it (like the mirror).
12011201
// It has to be an object not a Mutex because it's held through java calls.
12021202
oop init_lock() const;
1203+
1204+
// Returns the array class for the n'th dimension
1205+
virtual Klass* array_klass(int n, TRAPS);
1206+
virtual Klass* array_klass_or_null(int n);
1207+
1208+
// Returns the array class with this class as element type
1209+
virtual Klass* array_klass(TRAPS);
1210+
virtual Klass* array_klass_or_null();
1211+
12031212
private:
12041213
void fence_and_clear_init_lock();
12051214

@@ -1211,12 +1220,6 @@ class InstanceKlass: public Klass {
12111220
/* jni_id_for_impl for jfieldID only */
12121221
JNIid* jni_id_for_impl (int offset);
12131222

1214-
// Returns the array class for the n'th dimension
1215-
Klass* array_klass_impl(bool or_null, int n, TRAPS);
1216-
1217-
// Returns the array class with this class as element type
1218-
Klass* array_klass_impl(bool or_null, TRAPS);
1219-
12201223
// find a local method (returns NULL if not found)
12211224
Method* find_method_impl(const Symbol* name,
12221225
const Symbol* signature,

src/hotspot/share/oops/klass.cpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -644,33 +644,6 @@ void Klass::set_archived_java_mirror(oop m) {
644644
}
645645
#endif // INCLUDE_CDS_JAVA_HEAP
646646

647-
Klass* Klass::array_klass_or_null(int rank) {
648-
EXCEPTION_MARK;
649-
// No exception can be thrown by array_klass_impl when called with or_null == true.
650-
// (In anycase, the execption mark will fail if it do so)
651-
return array_klass_impl(true, rank, THREAD);
652-
}
653-
654-
655-
Klass* Klass::array_klass_or_null() {
656-
EXCEPTION_MARK;
657-
// No exception can be thrown by array_klass_impl when called with or_null == true.
658-
// (In anycase, the execption mark will fail if it do so)
659-
return array_klass_impl(true, THREAD);
660-
}
661-
662-
663-
Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) {
664-
fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
665-
return NULL;
666-
}
667-
668-
669-
Klass* Klass::array_klass_impl(bool or_null, TRAPS) {
670-
fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
671-
return NULL;
672-
}
673-
674647
void Klass::check_array_allocation_length(int length, int max_length, TRAPS) {
675648
if (length > max_length) {
676649
if (!THREAD->in_retryable_allocation()) {

src/hotspot/share/oops/klass.hpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -503,15 +503,14 @@ class Klass : public Metadata {
503503
}
504504

505505
// array class with specific rank
506-
Klass* array_klass(int rank, TRAPS) { return array_klass_impl(false, rank, THREAD); }
506+
virtual Klass* array_klass(int rank, TRAPS) = 0;
507507

508508
// array class with this klass as element type
509-
Klass* array_klass(TRAPS) { return array_klass_impl(false, THREAD); }
509+
virtual Klass* array_klass(TRAPS) = 0;
510510

511511
// These will return NULL instead of allocating on the heap:
512-
// NB: these can block for a mutex, like other functions with TRAPS arg.
513-
Klass* array_klass_or_null(int rank);
514-
Klass* array_klass_or_null();
512+
virtual Klass* array_klass_or_null(int rank) = 0;
513+
virtual Klass* array_klass_or_null() = 0;
515514

516515
virtual oop protection_domain() const = 0;
517516

@@ -520,8 +519,6 @@ class Klass : public Metadata {
520519
inline oop klass_holder() const;
521520

522521
protected:
523-
virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS);
524-
virtual Klass* array_klass_impl(bool or_null, TRAPS);
525522

526523
// Error handling when length > max_length or length < 0
527524
static void check_array_allocation_length(int length, int max_length, TRAPS);

src/hotspot/share/oops/objArrayKlass.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,15 +310,14 @@ void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
310310
}
311311

312312

313-
Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
313+
Klass* ObjArrayKlass::array_klass(int n, TRAPS) {
314314

315315
assert(dimension() <= n, "check order of chain");
316316
int dim = dimension();
317317
if (dim == n) return this;
318318

319319
// lock-free read needs acquire semantics
320320
if (higher_dimension_acquire() == NULL) {
321-
if (or_null) return NULL;
322321

323322
ResourceMark rm(THREAD);
324323
{
@@ -341,15 +340,31 @@ Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
341340
}
342341

343342
ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
344-
if (or_null) {
345-
return ak->array_klass_or_null(n);
346-
}
347343
THREAD->as_Java_thread()->check_possible_safepoint();
348344
return ak->array_klass(n, THREAD);
349345
}
350346

351-
Klass* ObjArrayKlass::array_klass_impl(bool or_null, TRAPS) {
352-
return array_klass_impl(or_null, dimension() + 1, THREAD);
347+
Klass* ObjArrayKlass::array_klass_or_null(int n) {
348+
349+
assert(dimension() <= n, "check order of chain");
350+
int dim = dimension();
351+
if (dim == n) return this;
352+
353+
// lock-free read needs acquire semantics
354+
if (higher_dimension_acquire() == NULL) {
355+
return NULL;
356+
}
357+
358+
ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
359+
return ak->array_klass_or_null(n);
360+
}
361+
362+
Klass* ObjArrayKlass::array_klass(TRAPS) {
363+
return array_klass(dimension() + 1, THREAD);
364+
}
365+
366+
Klass* ObjArrayKlass::array_klass_or_null() {
367+
return array_klass_or_null(dimension() + 1);
353368
}
354369

355370
bool ObjArrayKlass::can_be_primary_super_slow() const {

src/hotspot/share/oops/objArrayKlass.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ class ObjArrayKlass : public ArrayKlass {
9595
void do_copy(arrayOop s, size_t src_offset,
9696
arrayOop d, size_t dst_offset,
9797
int length, TRAPS);
98-
protected:
98+
public:
9999
// Returns the ObjArrayKlass for n'th dimension.
100-
virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
100+
virtual Klass* array_klass(int n, TRAPS);
101+
virtual Klass* array_klass_or_null(int n);
101102

102103
// Returns the array class with this class as element type.
103-
virtual Klass* array_klass_impl(bool or_null, TRAPS);
104-
105-
public:
104+
virtual Klass* array_klass(TRAPS);
105+
virtual Klass* array_klass_or_null();
106106

107107
static ObjArrayKlass* cast(Klass* k) {
108108
return const_cast<ObjArrayKlass*>(cast(const_cast<const Klass*>(k)));

src/hotspot/share/oops/typeArrayKlass.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,14 @@ void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos
171171
}
172172

173173
// create a klass of array holding typeArrays
174-
Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
174+
Klass* TypeArrayKlass::array_klass(int n, TRAPS) {
175175
int dim = dimension();
176176
assert(dim <= n, "check order of chain");
177177
if (dim == n)
178178
return this;
179179

180180
// lock-free read needs acquire semantics
181181
if (higher_dimension_acquire() == NULL) {
182-
if (or_null) return NULL;
183182

184183
ResourceMark rm;
185184
JavaThread *jt = THREAD->as_Java_thread();
@@ -200,15 +199,32 @@ Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
200199
}
201200

202201
ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
203-
if (or_null) {
204-
return h_ak->array_klass_or_null(n);
205-
}
206202
THREAD->as_Java_thread()->check_possible_safepoint();
207203
return h_ak->array_klass(n, THREAD);
208204
}
209205

210-
Klass* TypeArrayKlass::array_klass_impl(bool or_null, TRAPS) {
211-
return array_klass_impl(or_null, dimension() + 1, THREAD);
206+
// return existing klass of array holding typeArrays
207+
Klass* TypeArrayKlass::array_klass_or_null(int n) {
208+
int dim = dimension();
209+
assert(dim <= n, "check order of chain");
210+
if (dim == n)
211+
return this;
212+
213+
// lock-free read needs acquire semantics
214+
if (higher_dimension_acquire() == NULL) {
215+
return NULL;
216+
}
217+
218+
ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
219+
return h_ak->array_klass_or_null(n);
220+
}
221+
222+
Klass* TypeArrayKlass::array_klass(TRAPS) {
223+
return array_klass(dimension() + 1, THREAD);
224+
}
225+
226+
Klass* TypeArrayKlass::array_klass_or_null() {
227+
return array_klass_or_null(dimension() + 1);
212228
}
213229

214230
int TypeArrayKlass::oop_size(oop obj) const {

src/hotspot/share/oops/typeArrayKlass.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,15 @@ class TypeArrayKlass : public ArrayKlass {
9393
template <typename T, typename OopClosureType>
9494
inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
9595

96-
protected:
96+
public:
9797
// Find n'th dimensional array
98-
virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
98+
virtual Klass* array_klass(int n, TRAPS);
99+
virtual Klass* array_klass_or_null(int n);
99100

100101
// Returns the array class with this class as element type
101-
virtual Klass* array_klass_impl(bool or_null, TRAPS);
102+
virtual Klass* array_klass(TRAPS);
103+
virtual Klass* array_klass_or_null();
102104

103-
public:
104105
static TypeArrayKlass* cast(Klass* k) {
105106
return const_cast<TypeArrayKlass*>(cast(const_cast<const Klass*>(k)));
106107
}

0 commit comments

Comments
 (0)