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 package sun.jvm.hotspot.gc.z;
26
27 import sun.jvm.hotspot.debugger.Address;
28
29 class ZAddress {
30 static long as_long(Address value) {
31 if (value == null) {
32 return 0;
33 }
34 return value.asLongValue();
35 };
36
37 static boolean is_null(Address value) {
38 return value == null;
39 }
40
41 static boolean is_weak_bad(Address value) {
42 return (as_long(value) & ZGlobals.ZAddressWeakBadMask()) != 0;
43 }
44
45 static boolean is_weak_good(Address value) {
46 return !is_weak_bad(value) && !is_null(value);
47 }
48
49 static boolean is_weak_good_or_null(Address value) {
50 return !is_weak_bad(value);
51 }
52
53 static long offset(Address address) {
54 return as_long(address) & ZGlobals.ZAddressOffsetMask;
55 }
56
57 static Address address(long value) {
58 // TODO: Linux-specific - We don't use a heap base on Linux
59 return ZOop.to_address(value);
60 }
61
62 static Address good(Address value) {
63 return address(offset(value) | ZGlobals.ZAddressGoodMask());
64 }
65
66 static Address good_or_null(Address value) {
67 return is_null(value) ? value : good(value);
68 }
69 }
|
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 package sun.jvm.hotspot.gc.z;
26
27 import sun.jvm.hotspot.debugger.Address;
28 import sun.jvm.hotspot.debugger.OopHandle;
29 import sun.jvm.hotspot.runtime.VM;
30 import sun.jvm.hotspot.types.TypeDataBase;
31 import sun.jvm.hotspot.types.WrongTypeException;
32
33 class ZAddress {
34
35 private static long ZAddressWeakBadMask;
36 private static long ZAddressGoodMask;
37 private static long ZAddressOffsetMask;
38
39 static {
40 VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase()));
41 }
42
43 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
44 ZAddressWeakBadMask = db.lookupLongConstant("ZAddressWeakBadMask").longValue();
45 ZAddressGoodMask = db.lookupLongConstant("ZAddressGoodMask").longValue();
46 ZAddressOffsetMask = db.lookupLongConstant("ZAddressOffsetMask").longValue();
47 }
48
49 static long as_long(Address value) {
50 if (value == null) {
51 return 0;
52 }
53 return value.asLongValue();
54 };
55
56 static boolean is_null(Address value) {
57 return value == null;
58 }
59
60 static boolean is_weak_bad(Address value) {
61 return (as_long(value) & ZAddressWeakBadMask) != 0;
62 }
63
64 static boolean is_weak_good(Address value) {
65 return !is_weak_bad(value) && !is_null(value);
66 }
67
68 static boolean is_weak_good_or_null(Address value) {
69 return !is_weak_bad(value);
70 }
71
72 static Address offset(Address address) {
73 return address.andWithMask(ZAddressOffsetMask);
74 }
75
76 static Address address(Address addr) {
77 // TODO: Linux-specific - We don't use a heap base on Linux
78 return ZOop.to_address(addr);
79 }
80
81 static Address good(Address value) {
82 return address(offset(value).orWithMask(ZAddressGoodMask));
83 }
84
85 static Address good_or_null(Address value) {
86 return is_null(value) ? value : good(value);
87 }
88 }
|