Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/oops/array.hpp
40951 views
1
/*
2
* Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_OOPS_ARRAY_HPP
26
#define SHARE_OOPS_ARRAY_HPP
27
28
#include "runtime/atomic.hpp"
29
#include "utilities/align.hpp"
30
#include "utilities/exceptions.hpp"
31
#include "utilities/globalDefinitions.hpp"
32
#include "utilities/ostream.hpp"
33
34
// Array for metadata allocation
35
36
template <typename T>
37
class Array: public MetaspaceObj {
38
friend class ArchiveBuilder;
39
friend class MetadataFactory;
40
friend class VMStructs;
41
friend class JVMCIVMStructs;
42
friend class MethodHandleCompiler; // special case
43
friend class WhiteBox;
44
protected:
45
int _length; // the number of array elements
46
T _data[1]; // the array memory
47
48
void initialize(int length) {
49
_length = length;
50
}
51
52
private:
53
NONCOPYABLE(Array);
54
55
inline void* operator new(size_t size, ClassLoaderData* loader_data, int length, TRAPS) throw();
56
57
static size_t byte_sizeof(int length, size_t elm_byte_size) {
58
return sizeof(Array<T>) + MAX2(length - 1, 0) * elm_byte_size;
59
}
60
static size_t byte_sizeof(int length) { return byte_sizeof(length, sizeof(T)); }
61
62
// WhiteBox API helper.
63
// Can't distinguish between array of length 0 and length 1,
64
// will always return 0 in those cases.
65
static int bytes_to_length(size_t bytes) {
66
assert(is_aligned(bytes, BytesPerWord), "Must be, for now");
67
68
if (sizeof(Array<T>) >= bytes) {
69
return 0;
70
}
71
72
size_t left = bytes - sizeof(Array<T>);
73
assert(is_aligned(left, sizeof(T)), "Must be");
74
75
size_t elements = left / sizeof(T);
76
assert(elements <= (size_t)INT_MAX, "number of elements " SIZE_FORMAT "doesn't fit into an int.", elements);
77
78
int length = (int)elements;
79
80
assert((size_t)size(length) * BytesPerWord == (size_t)bytes,
81
"Expected: " SIZE_FORMAT " got: " SIZE_FORMAT,
82
bytes, (size_t)size(length) * BytesPerWord);
83
84
return length;
85
}
86
87
explicit Array(int length) : _length(length) {
88
assert(length >= 0, "illegal length");
89
}
90
91
Array(int length, T init) : _length(length) {
92
assert(length >= 0, "illegal length");
93
for (int i = 0; i < length; i++) {
94
_data[i] = init;
95
}
96
}
97
98
public:
99
100
// standard operations
101
int length() const { return _length; }
102
T* data() { return _data; }
103
bool is_empty() const { return length() == 0; }
104
105
int index_of(const T& x) const {
106
int i = length();
107
while (i-- > 0 && _data[i] != x) ;
108
109
return i;
110
}
111
112
// sort the array.
113
bool contains(const T& x) const { return index_of(x) >= 0; }
114
115
T at(int i) const { assert(i >= 0 && i< _length, "oob: 0 <= %d < %d", i, _length); return _data[i]; }
116
void at_put(const int i, const T& x) { assert(i >= 0 && i< _length, "oob: 0 <= %d < %d", i, _length); _data[i] = x; }
117
T* adr_at(const int i) { assert(i >= 0 && i< _length, "oob: 0 <= %d < %d", i, _length); return &_data[i]; }
118
int find(const T& x) { return index_of(x); }
119
120
T at_acquire(const int i) { return Atomic::load_acquire(adr_at(i)); }
121
void release_at_put(int i, T x) { Atomic::release_store(adr_at(i), x); }
122
123
static int size(int length) {
124
size_t bytes = align_up(byte_sizeof(length), BytesPerWord);
125
size_t words = bytes / BytesPerWord;
126
127
assert(words <= INT_MAX, "Overflow: " SIZE_FORMAT, words);
128
129
return (int)words;
130
}
131
int size() {
132
return size(_length);
133
}
134
135
static int length_offset_in_bytes() { return (int) (offset_of(Array<T>, _length)); }
136
// Note, this offset don't have to be wordSize aligned.
137
static int base_offset_in_bytes() { return (int) (offset_of(Array<T>, _data)); };
138
139
// FIXME: How to handle this?
140
void print_value_on(outputStream* st) const {
141
st->print("Array<T>(" INTPTR_FORMAT ")", p2i(this));
142
}
143
144
#ifndef PRODUCT
145
void print(outputStream* st) {
146
for (int i = 0; i< _length; i++) {
147
st->print_cr("%d: " INTPTR_FORMAT, i, (intptr_t)at(i));
148
}
149
}
150
void print() { print(tty); }
151
#endif // PRODUCT
152
};
153
154
155
#endif // SHARE_OOPS_ARRAY_HPP
156
157