< prev index next > src/hotspot/share/oops/objArrayOop.inline.hpp
Print this page
/*
- * Copyright (c) 2015, 2020, and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
#include "oops/objArrayOop.hpp"
#include "oops/access.hpp"
#include "oops/arrayOop.hpp"
+ #include "oops/flatArrayOop.inline.hpp"
#include "oops/objArrayKlass.inline.hpp"
#include "oops/oop.inline.hpp"
+ #include "oops/refArrayKlass.inline.hpp"
#include "runtime/globals.hpp"
inline HeapWord* objArrayOopDesc::base() const { return (HeapWord*) arrayOopDesc::base(T_OBJECT); }
template <class T> T* objArrayOopDesc::obj_at_addr(int index) const {
return &((T*)base())[index];
}
inline oop objArrayOopDesc::obj_at(int index) const {
assert(is_within_bounds(index), "index %d out of bounds %d", index, length());
- ptrdiff_t offset = UseCompressedOops ? obj_at_offset<narrowOop>(index) : obj_at_offset<oop>(index);
- return HeapAccess<IS_ARRAY>::oop_load_at(as_oop(), offset);
+ if (is_flatArray()) {
+ return ((const flatArrayOopDesc* )this)->obj_at(index);
+ } else {
+ return ((const refArrayOopDesc* )this)->obj_at(index);
+ }
+ }
+
+ inline oop objArrayOopDesc::obj_at(int index, TRAPS) const {
+ assert(is_within_bounds(index), "index %d out of bounds %d", index, length());
+ if (is_flatArray()) {
+ return ((const flatArrayOopDesc* )this)->obj_at(index, CHECK_NULL);
+ } else {
+ return ((const refArrayOopDesc* )this)->obj_at(index, CHECK_NULL);
+ }
}
inline void objArrayOopDesc::obj_at_put(int index, oop value) {
assert(is_within_bounds(index), "index %d out of bounds %d", index, length());
- ptrdiff_t offset = UseCompressedOops ? obj_at_offset<narrowOop>(index) : obj_at_offset<oop>(index);
- HeapAccess<IS_ARRAY>::oop_store_at(as_oop(), offset, value);
+ if (is_flatArray()) {
+ ((flatArrayOopDesc* )this)->obj_at_put(index, value);
+ } else {
+ ((refArrayOopDesc* )this)->obj_at_put(index, value);
+ }
+ }
+
+ inline void objArrayOopDesc::obj_at_put(int index, oop value, TRAPS) {
+ assert(is_within_bounds(index), "index %d out of bounds %d", index, length());
+ if (is_flatArray()) {
+ ((flatArrayOopDesc* )this)->obj_at_put(index, value, CHECK);
+ } else {
+ ((refArrayOopDesc* )this)->obj_at_put(index, value, CHECK);
+ }
}
template <typename OopClosureType>
void objArrayOopDesc::oop_iterate_elements_range(OopClosureType* blk, int start, int end) {
- if (UseCompressedOops) {
- ((ObjArrayKlass*)klass())->oop_oop_iterate_elements_range<narrowOop>(this, blk, start, end);
+ if (is_flatArray()) {
+ ((flatArrayOopDesc* )this)->oop_iterate_elements_range(blk, start, end);
} else {
- ((ObjArrayKlass*)klass())->oop_oop_iterate_elements_range<oop>(this, blk, start, end);
+ ((refArrayOopDesc* )this)->oop_iterate_elements_range(blk, start, end);
}
}
#endif // SHARE_OOPS_OBJARRAYOOP_INLINE_HPP
< prev index next >