< prev index next >

test/hotspot/gtest/oops/test_arrayOop.cpp

Print this page
@@ -1,7 +1,7 @@
  /*
-  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 1997, 2023, 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.

@@ -25,23 +25,15 @@
  #include "oops/arrayOop.hpp"
  #include "oops/oop.inline.hpp"
  #include "unittest.hpp"
  #include "utilities/globalDefinitions.hpp"
  
- class arrayOopDescTest {
-  public:
- 
-   static int header_size_in_bytes() {
-     return arrayOopDesc::header_size_in_bytes();
-   }
- };
- 
  static bool check_max_length_overflow(BasicType type) {
    julong length = arrayOopDesc::max_array_length(type);
    julong bytes_per_element = type2aelembytes(type);
    julong bytes = length * bytes_per_element
-           + arrayOopDescTest::header_size_in_bytes();
+           + arrayOopDesc::base_offset_in_bytes(type);
    return (julong) (size_t) bytes == bytes;
  }
  
  TEST_VM(arrayOopDesc, boolean) {
    ASSERT_PRED1(check_max_length_overflow, T_BOOLEAN);

@@ -85,5 +77,60 @@
  
  TEST_VM(arrayOopDesc, narrowOop) {
    ASSERT_PRED1(check_max_length_overflow, T_NARROWOOP);
  }
  // T_VOID and T_ADDRESS are not supported by max_array_length()
+ 
+ TEST_VM(arrayOopDesc, base_offset) {
+ #ifdef _LP64
+   if (UseCompactObjectHeaders) {
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BOOLEAN), 12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BYTE),    12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_SHORT),   12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_CHAR),    12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_INT),     12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_FLOAT),   12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_LONG),    16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_DOUBLE),  16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_OBJECT),  12);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_ARRAY),   12);
+   } else if (UseCompressedClassPointers) {
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BOOLEAN), 16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BYTE),    16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_SHORT),   16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_CHAR),    16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_INT),     16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_FLOAT),   16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_LONG),    16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_DOUBLE),  16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_OBJECT),  16);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_ARRAY),   16);
+   } else {
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BOOLEAN), 20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BYTE),    20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_SHORT),   20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_CHAR),    20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_INT),     20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_FLOAT),   20);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_LONG),    24);
+     EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_DOUBLE),  24);
+     if (UseCompressedOops) {
+       EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_OBJECT), 20);
+       EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_ARRAY),  20);
+     } else {
+       EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_OBJECT), 24);
+       EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_ARRAY),  24);
+     }
+   }
+ #else
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BOOLEAN), 12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_BYTE),    12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_SHORT),   12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_CHAR),    12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_INT),     12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_FLOAT),   12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_LONG),    16);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_DOUBLE),  16);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_OBJECT),  12);
+   EXPECT_EQ(arrayOopDesc::base_offset_in_bytes(T_ARRAY),   12);
+ #endif
+ }
< prev index next >