< prev index next >

src/hotspot/share/oops/objArrayOop.inline.hpp

Print this page
@@ -1,7 +1,7 @@
  /*
-  * 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.

@@ -27,12 +27,14 @@
  
  #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 {

@@ -40,25 +42,49 @@
    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 >