27
28 #include "oops/arrayOop.hpp"
29 #include "oops/typeArrayKlass.hpp"
30 #include "runtime/orderAccess.inline.hpp"
31
32 // A typeArrayOop is an array containing basic types (non oop elements).
33 // It is used for arrays of {characters, singles, doubles, bytes, shorts, integers, longs}
34 #include <limits.h>
35
36 class typeArrayOopDesc : public arrayOopDesc {
37 protected:
38 jchar* char_base() const { return (jchar*) base(T_CHAR); }
39 jboolean* bool_base() const { return (jboolean*)base(T_BOOLEAN); }
40 jbyte* byte_base() const { return (jbyte*) base(T_BYTE); }
41 jint* int_base() const { return (jint*) base(T_INT); }
42 jlong* long_base() const { return (jlong*) base(T_LONG); }
43 jshort* short_base() const { return (jshort*) base(T_SHORT); }
44 jfloat* float_base() const { return (jfloat*) base(T_FLOAT); }
45 jdouble* double_base() const { return (jdouble*) base(T_DOUBLE); }
46
47 friend class TypeArrayKlass;
48
49 public:
50 jbyte* byte_at_addr(int which) const {
51 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
52 return &byte_base()[which];
53 }
54
55 jboolean* bool_at_addr(int which) const {
56 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
57 return &bool_base()[which];
58 }
59
60 jchar* char_at_addr(int which) const {
61 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
62 return &char_base()[which];
63 }
64
65 jint* int_at_addr(int which) const {
66 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
75 jushort* ushort_at_addr(int which) const { // for field descriptor arrays
76 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
77 return (jushort*) &short_base()[which];
78 }
79
80 jlong* long_at_addr(int which) const {
81 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
82 return &long_base()[which];
83 }
84
85 jfloat* float_at_addr(int which) const {
86 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
87 return &float_base()[which];
88 }
89
90 jdouble* double_at_addr(int which) const {
91 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
92 return &double_base()[which];
93 }
94
95 jbyte byte_at(int which) const { return *byte_at_addr(which); }
96 void byte_at_put(int which, jbyte contents) { *byte_at_addr(which) = contents; }
97
98 jboolean bool_at(int which) const { return *bool_at_addr(which); }
99 void bool_at_put(int which, jboolean contents) { *bool_at_addr(which) = (((jint)contents) & 1); }
100
101 jchar char_at(int which) const { return *char_at_addr(which); }
102 void char_at_put(int which, jchar contents) { *char_at_addr(which) = contents; }
103
104 jint int_at(int which) const { return *int_at_addr(which); }
105 void int_at_put(int which, jint contents) { *int_at_addr(which) = contents; }
106
107 jshort short_at(int which) const { return *short_at_addr(which); }
108 void short_at_put(int which, jshort contents) { *short_at_addr(which) = contents; }
109
110 jushort ushort_at(int which) const { return *ushort_at_addr(which); }
111 void ushort_at_put(int which, jushort contents) { *ushort_at_addr(which) = contents; }
112
113 jlong long_at(int which) const { return *long_at_addr(which); }
114 void long_at_put(int which, jlong contents) { *long_at_addr(which) = contents; }
115
116 jfloat float_at(int which) const { return *float_at_addr(which); }
117 void float_at_put(int which, jfloat contents) { *float_at_addr(which) = contents; }
118
119 jdouble double_at(int which) const { return *double_at_addr(which); }
120 void double_at_put(int which, jdouble contents) { *double_at_addr(which) = contents; }
121
122 jbyte byte_at_acquire(int which) const { return OrderAccess::load_acquire(byte_at_addr(which)); }
123 void release_byte_at_put(int which, jbyte contents) { OrderAccess::release_store(byte_at_addr(which), contents); }
124
125 // Java thinks Symbol arrays are just arrays of either long or int, since
126 // there doesn't seem to be T_ADDRESS, so this is a bit of unfortunate
127 // casting
128 #ifdef _LP64
129 Symbol* symbol_at(int which) const {
130 return (Symbol*)*long_at_addr(which); }
131 void symbol_at_put(int which, Symbol* contents) {
132 *long_at_addr(which) = (jlong)contents;
133 }
134 #else
135 Symbol* symbol_at(int which) const {
136 return (Symbol*)*int_at_addr(which); }
137 void symbol_at_put(int which, Symbol* contents) {
138 *int_at_addr(which) = (int)contents;
139 }
140 #endif // _LP64
141
142 // Sizing
143
|
27
28 #include "oops/arrayOop.hpp"
29 #include "oops/typeArrayKlass.hpp"
30 #include "runtime/orderAccess.inline.hpp"
31
32 // A typeArrayOop is an array containing basic types (non oop elements).
33 // It is used for arrays of {characters, singles, doubles, bytes, shorts, integers, longs}
34 #include <limits.h>
35
36 class typeArrayOopDesc : public arrayOopDesc {
37 protected:
38 jchar* char_base() const { return (jchar*) base(T_CHAR); }
39 jboolean* bool_base() const { return (jboolean*)base(T_BOOLEAN); }
40 jbyte* byte_base() const { return (jbyte*) base(T_BYTE); }
41 jint* int_base() const { return (jint*) base(T_INT); }
42 jlong* long_base() const { return (jlong*) base(T_LONG); }
43 jshort* short_base() const { return (jshort*) base(T_SHORT); }
44 jfloat* float_base() const { return (jfloat*) base(T_FLOAT); }
45 jdouble* double_base() const { return (jdouble*) base(T_DOUBLE); }
46
47 static int char_at_offset(int index) { return base_offset_in_bytes(T_CHAR) + sizeof(jchar) * index; }
48 static int bool_at_offset(int index) { return base_offset_in_bytes(T_BOOLEAN) + sizeof(jboolean) * index; }
49 static int byte_at_offset(int index) { return base_offset_in_bytes(T_BYTE) + sizeof(jbyte) * index; }
50 static int int_at_offset(int index) { return base_offset_in_bytes(T_INT) + sizeof(jint) * index; }
51 static int long_at_offset(int index) { return base_offset_in_bytes(T_LONG) + sizeof(jlong) * index; }
52 static int short_at_offset(int index) { return base_offset_in_bytes(T_SHORT) + sizeof(jshort) * index; }
53 static int float_at_offset(int index) { return base_offset_in_bytes(T_FLOAT) + sizeof(jfloat) * index; }
54 static int double_at_offset(int index) { return base_offset_in_bytes(T_DOUBLE) + sizeof(jdouble) * index; }
55
56 friend class TypeArrayKlass;
57
58 public:
59 jbyte* byte_at_addr(int which) const {
60 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
61 return &byte_base()[which];
62 }
63
64 jboolean* bool_at_addr(int which) const {
65 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
66 return &bool_base()[which];
67 }
68
69 jchar* char_at_addr(int which) const {
70 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
71 return &char_base()[which];
72 }
73
74 jint* int_at_addr(int which) const {
75 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
84 jushort* ushort_at_addr(int which) const { // for field descriptor arrays
85 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
86 return (jushort*) &short_base()[which];
87 }
88
89 jlong* long_at_addr(int which) const {
90 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
91 return &long_base()[which];
92 }
93
94 jfloat* float_at_addr(int which) const {
95 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
96 return &float_base()[which];
97 }
98
99 jdouble* double_at_addr(int which) const {
100 assert(is_within_bounds(which), "index %d out of bounds %d", which, length());
101 return &double_base()[which];
102 }
103
104 jbyte byte_at(int which) const;
105 void byte_at_put(int which, jbyte contents);
106
107 jboolean bool_at(int which) const;
108 void bool_at_put(int which, jboolean contents);
109
110 jchar char_at(int which) const;
111 void char_at_put(int which, jchar contents);
112
113 jint int_at(int which) const;
114 void int_at_put(int which, jint contents);
115
116 jshort short_at(int which) const;
117 void short_at_put(int which, jshort contents);
118
119 jushort ushort_at(int which) const;
120 void ushort_at_put(int which, jushort contents);
121
122 jlong long_at(int which) const;
123 void long_at_put(int which, jlong contents);
124
125 jfloat float_at(int which) const;
126 void float_at_put(int which, jfloat contents);
127
128 jdouble double_at(int which) const;
129 void double_at_put(int which, jdouble contents);
130
131 jbyte byte_at_acquire(int which) const;
132 void release_byte_at_put(int which, jbyte contents);
133
134 // Java thinks Symbol arrays are just arrays of either long or int, since
135 // there doesn't seem to be T_ADDRESS, so this is a bit of unfortunate
136 // casting
137 #ifdef _LP64
138 Symbol* symbol_at(int which) const {
139 return (Symbol*)*long_at_addr(which); }
140 void symbol_at_put(int which, Symbol* contents) {
141 *long_at_addr(which) = (jlong)contents;
142 }
143 #else
144 Symbol* symbol_at(int which) const {
145 return (Symbol*)*int_at_addr(which); }
146 void symbol_at_put(int which, Symbol* contents) {
147 *int_at_addr(which) = (int)contents;
148 }
149 #endif // _LP64
150
151 // Sizing
152
|