mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8266017: Refactor the *klass::array_klass_impl code to separate the non-exception-throwing API
Reviewed-by: coleenp, iklam
This commit is contained in:
parent
f75dd80254
commit
23180f848f
8 changed files with 86 additions and 72 deletions
|
@ -1427,11 +1427,9 @@ void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
Klass* InstanceKlass::array_klass(int n, TRAPS) {
|
||||||
// Need load-acquire for lock-free read
|
// Need load-acquire for lock-free read
|
||||||
if (array_klasses_acquire() == NULL) {
|
if (array_klasses_acquire() == NULL) {
|
||||||
if (or_null) return NULL;
|
|
||||||
|
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
JavaThread *jt = THREAD->as_Java_thread();
|
JavaThread *jt = THREAD->as_Java_thread();
|
||||||
{
|
{
|
||||||
|
@ -1446,16 +1444,27 @@ Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// _this will always be set at this point
|
// array_klasses() will always be set at this point
|
||||||
ObjArrayKlass* oak = array_klasses();
|
ObjArrayKlass* oak = array_klasses();
|
||||||
if (or_null) {
|
|
||||||
return oak->array_klass_or_null(n);
|
|
||||||
}
|
|
||||||
return oak->array_klass(n, THREAD);
|
return oak->array_klass(n, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Klass* InstanceKlass::array_klass_impl(bool or_null, TRAPS) {
|
Klass* InstanceKlass::array_klass_or_null(int n) {
|
||||||
return array_klass_impl(or_null, 1, THREAD);
|
// Need load-acquire for lock-free read
|
||||||
|
ObjArrayKlass* oak = array_klasses_acquire();
|
||||||
|
if (oak == NULL) {
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
return oak->array_klass_or_null(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* InstanceKlass::array_klass(TRAPS) {
|
||||||
|
return array_klass(1, THREAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* InstanceKlass::array_klass_or_null() {
|
||||||
|
return array_klass_or_null(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int call_class_initializer_counter = 0; // for debugging
|
static int call_class_initializer_counter = 0; // for debugging
|
||||||
|
|
|
@ -1200,6 +1200,15 @@ public:
|
||||||
// cannot lock it (like the mirror).
|
// cannot lock it (like the mirror).
|
||||||
// It has to be an object not a Mutex because it's held through java calls.
|
// It has to be an object not a Mutex because it's held through java calls.
|
||||||
oop init_lock() const;
|
oop init_lock() const;
|
||||||
|
|
||||||
|
// Returns the array class for the n'th dimension
|
||||||
|
virtual Klass* array_klass(int n, TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null(int n);
|
||||||
|
|
||||||
|
// Returns the array class with this class as element type
|
||||||
|
virtual Klass* array_klass(TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fence_and_clear_init_lock();
|
void fence_and_clear_init_lock();
|
||||||
|
|
||||||
|
@ -1211,12 +1220,6 @@ private:
|
||||||
/* jni_id_for_impl for jfieldID only */
|
/* jni_id_for_impl for jfieldID only */
|
||||||
JNIid* jni_id_for_impl (int offset);
|
JNIid* jni_id_for_impl (int offset);
|
||||||
|
|
||||||
// Returns the array class for the n'th dimension
|
|
||||||
Klass* array_klass_impl(bool or_null, int n, TRAPS);
|
|
||||||
|
|
||||||
// Returns the array class with this class as element type
|
|
||||||
Klass* array_klass_impl(bool or_null, TRAPS);
|
|
||||||
|
|
||||||
// find a local method (returns NULL if not found)
|
// find a local method (returns NULL if not found)
|
||||||
Method* find_method_impl(const Symbol* name,
|
Method* find_method_impl(const Symbol* name,
|
||||||
const Symbol* signature,
|
const Symbol* signature,
|
||||||
|
|
|
@ -644,33 +644,6 @@ void Klass::set_archived_java_mirror(oop m) {
|
||||||
}
|
}
|
||||||
#endif // INCLUDE_CDS_JAVA_HEAP
|
#endif // INCLUDE_CDS_JAVA_HEAP
|
||||||
|
|
||||||
Klass* Klass::array_klass_or_null(int rank) {
|
|
||||||
EXCEPTION_MARK;
|
|
||||||
// No exception can be thrown by array_klass_impl when called with or_null == true.
|
|
||||||
// (In anycase, the execption mark will fail if it do so)
|
|
||||||
return array_klass_impl(true, rank, THREAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Klass* Klass::array_klass_or_null() {
|
|
||||||
EXCEPTION_MARK;
|
|
||||||
// No exception can be thrown by array_klass_impl when called with or_null == true.
|
|
||||||
// (In anycase, the execption mark will fail if it do so)
|
|
||||||
return array_klass_impl(true, THREAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) {
|
|
||||||
fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Klass* Klass::array_klass_impl(bool or_null, TRAPS) {
|
|
||||||
fatal("array_klass should be dispatched to InstanceKlass, ObjArrayKlass or TypeArrayKlass");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Klass::check_array_allocation_length(int length, int max_length, TRAPS) {
|
void Klass::check_array_allocation_length(int length, int max_length, TRAPS) {
|
||||||
if (length > max_length) {
|
if (length > max_length) {
|
||||||
if (!THREAD->in_retryable_allocation()) {
|
if (!THREAD->in_retryable_allocation()) {
|
||||||
|
|
|
@ -503,15 +503,14 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
// array class with specific rank
|
// array class with specific rank
|
||||||
Klass* array_klass(int rank, TRAPS) { return array_klass_impl(false, rank, THREAD); }
|
virtual Klass* array_klass(int rank, TRAPS) = 0;
|
||||||
|
|
||||||
// array class with this klass as element type
|
// array class with this klass as element type
|
||||||
Klass* array_klass(TRAPS) { return array_klass_impl(false, THREAD); }
|
virtual Klass* array_klass(TRAPS) = 0;
|
||||||
|
|
||||||
// These will return NULL instead of allocating on the heap:
|
// These will return NULL instead of allocating on the heap:
|
||||||
// NB: these can block for a mutex, like other functions with TRAPS arg.
|
virtual Klass* array_klass_or_null(int rank) = 0;
|
||||||
Klass* array_klass_or_null(int rank);
|
virtual Klass* array_klass_or_null() = 0;
|
||||||
Klass* array_klass_or_null();
|
|
||||||
|
|
||||||
virtual oop protection_domain() const = 0;
|
virtual oop protection_domain() const = 0;
|
||||||
|
|
||||||
|
@ -520,8 +519,6 @@ protected:
|
||||||
inline oop klass_holder() const;
|
inline oop klass_holder() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS);
|
|
||||||
virtual Klass* array_klass_impl(bool or_null, TRAPS);
|
|
||||||
|
|
||||||
// Error handling when length > max_length or length < 0
|
// Error handling when length > max_length or length < 0
|
||||||
static void check_array_allocation_length(int length, int max_length, TRAPS);
|
static void check_array_allocation_length(int length, int max_length, TRAPS);
|
||||||
|
|
|
@ -310,7 +310,7 @@ void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
Klass* ObjArrayKlass::array_klass(int n, TRAPS) {
|
||||||
|
|
||||||
assert(dimension() <= n, "check order of chain");
|
assert(dimension() <= n, "check order of chain");
|
||||||
int dim = dimension();
|
int dim = dimension();
|
||||||
|
@ -318,7 +318,6 @@ Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
||||||
|
|
||||||
// lock-free read needs acquire semantics
|
// lock-free read needs acquire semantics
|
||||||
if (higher_dimension_acquire() == NULL) {
|
if (higher_dimension_acquire() == NULL) {
|
||||||
if (or_null) return NULL;
|
|
||||||
|
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
{
|
{
|
||||||
|
@ -341,15 +340,31 @@ Klass* ObjArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
|
ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
|
||||||
if (or_null) {
|
|
||||||
return ak->array_klass_or_null(n);
|
|
||||||
}
|
|
||||||
THREAD->as_Java_thread()->check_possible_safepoint();
|
THREAD->as_Java_thread()->check_possible_safepoint();
|
||||||
return ak->array_klass(n, THREAD);
|
return ak->array_klass(n, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Klass* ObjArrayKlass::array_klass_impl(bool or_null, TRAPS) {
|
Klass* ObjArrayKlass::array_klass_or_null(int n) {
|
||||||
return array_klass_impl(or_null, dimension() + 1, THREAD);
|
|
||||||
|
assert(dimension() <= n, "check order of chain");
|
||||||
|
int dim = dimension();
|
||||||
|
if (dim == n) return this;
|
||||||
|
|
||||||
|
// lock-free read needs acquire semantics
|
||||||
|
if (higher_dimension_acquire() == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjArrayKlass *ak = ObjArrayKlass::cast(higher_dimension());
|
||||||
|
return ak->array_klass_or_null(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* ObjArrayKlass::array_klass(TRAPS) {
|
||||||
|
return array_klass(dimension() + 1, THREAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* ObjArrayKlass::array_klass_or_null() {
|
||||||
|
return array_klass_or_null(dimension() + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObjArrayKlass::can_be_primary_super_slow() const {
|
bool ObjArrayKlass::can_be_primary_super_slow() const {
|
||||||
|
|
|
@ -95,14 +95,14 @@ class ObjArrayKlass : public ArrayKlass {
|
||||||
void do_copy(arrayOop s, size_t src_offset,
|
void do_copy(arrayOop s, size_t src_offset,
|
||||||
arrayOop d, size_t dst_offset,
|
arrayOop d, size_t dst_offset,
|
||||||
int length, TRAPS);
|
int length, TRAPS);
|
||||||
protected:
|
public:
|
||||||
// Returns the ObjArrayKlass for n'th dimension.
|
// Returns the ObjArrayKlass for n'th dimension.
|
||||||
virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
|
virtual Klass* array_klass(int n, TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null(int n);
|
||||||
|
|
||||||
// Returns the array class with this class as element type.
|
// Returns the array class with this class as element type.
|
||||||
virtual Klass* array_klass_impl(bool or_null, TRAPS);
|
virtual Klass* array_klass(TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null();
|
||||||
public:
|
|
||||||
|
|
||||||
static ObjArrayKlass* cast(Klass* k) {
|
static ObjArrayKlass* cast(Klass* k) {
|
||||||
return const_cast<ObjArrayKlass*>(cast(const_cast<const Klass*>(k)));
|
return const_cast<ObjArrayKlass*>(cast(const_cast<const Klass*>(k)));
|
||||||
|
|
|
@ -171,7 +171,7 @@ void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a klass of array holding typeArrays
|
// create a klass of array holding typeArrays
|
||||||
Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
Klass* TypeArrayKlass::array_klass(int n, TRAPS) {
|
||||||
int dim = dimension();
|
int dim = dimension();
|
||||||
assert(dim <= n, "check order of chain");
|
assert(dim <= n, "check order of chain");
|
||||||
if (dim == n)
|
if (dim == n)
|
||||||
|
@ -179,7 +179,6 @@ Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
||||||
|
|
||||||
// lock-free read needs acquire semantics
|
// lock-free read needs acquire semantics
|
||||||
if (higher_dimension_acquire() == NULL) {
|
if (higher_dimension_acquire() == NULL) {
|
||||||
if (or_null) return NULL;
|
|
||||||
|
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
JavaThread *jt = THREAD->as_Java_thread();
|
JavaThread *jt = THREAD->as_Java_thread();
|
||||||
|
@ -200,15 +199,32 @@ Klass* TypeArrayKlass::array_klass_impl(bool or_null, int n, TRAPS) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
|
ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
|
||||||
if (or_null) {
|
|
||||||
return h_ak->array_klass_or_null(n);
|
|
||||||
}
|
|
||||||
THREAD->as_Java_thread()->check_possible_safepoint();
|
THREAD->as_Java_thread()->check_possible_safepoint();
|
||||||
return h_ak->array_klass(n, THREAD);
|
return h_ak->array_klass(n, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Klass* TypeArrayKlass::array_klass_impl(bool or_null, TRAPS) {
|
// return existing klass of array holding typeArrays
|
||||||
return array_klass_impl(or_null, dimension() + 1, THREAD);
|
Klass* TypeArrayKlass::array_klass_or_null(int n) {
|
||||||
|
int dim = dimension();
|
||||||
|
assert(dim <= n, "check order of chain");
|
||||||
|
if (dim == n)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
// lock-free read needs acquire semantics
|
||||||
|
if (higher_dimension_acquire() == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjArrayKlass* h_ak = ObjArrayKlass::cast(higher_dimension());
|
||||||
|
return h_ak->array_klass_or_null(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* TypeArrayKlass::array_klass(TRAPS) {
|
||||||
|
return array_klass(dimension() + 1, THREAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Klass* TypeArrayKlass::array_klass_or_null() {
|
||||||
|
return array_klass_or_null(dimension() + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TypeArrayKlass::oop_size(oop obj) const {
|
int TypeArrayKlass::oop_size(oop obj) const {
|
||||||
|
|
|
@ -93,14 +93,15 @@ class TypeArrayKlass : public ArrayKlass {
|
||||||
template <typename T, typename OopClosureType>
|
template <typename T, typename OopClosureType>
|
||||||
inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
|
inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
|
||||||
|
|
||||||
protected:
|
public:
|
||||||
// Find n'th dimensional array
|
// Find n'th dimensional array
|
||||||
virtual Klass* array_klass_impl(bool or_null, int n, TRAPS);
|
virtual Klass* array_klass(int n, TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null(int n);
|
||||||
|
|
||||||
// Returns the array class with this class as element type
|
// Returns the array class with this class as element type
|
||||||
virtual Klass* array_klass_impl(bool or_null, TRAPS);
|
virtual Klass* array_klass(TRAPS);
|
||||||
|
virtual Klass* array_klass_or_null();
|
||||||
|
|
||||||
public:
|
|
||||||
static TypeArrayKlass* cast(Klass* k) {
|
static TypeArrayKlass* cast(Klass* k) {
|
||||||
return const_cast<TypeArrayKlass*>(cast(const_cast<const Klass*>(k)));
|
return const_cast<TypeArrayKlass*>(cast(const_cast<const Klass*>(k)));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue