oop.cpp revision 0:a61af66fc99e
1/*
2 * Copyright 1997-2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25# include "incls/_precompiled.incl"
26# include "incls/_oop.cpp.incl"
27
28bool always_do_update_barrier = false;
29
30BarrierSet* oopDesc::_bs = NULL;
31
32#ifdef PRODUCT
33void oopDesc::print_on(outputStream* st) const {}
34void oopDesc::print_value_on(outputStream* st) const {}
35void oopDesc::print_address_on(outputStream* st) const {}
36char* oopDesc::print_value_string() { return NULL; }
37char* oopDesc::print_string() { return NULL; }
38void oopDesc::print()         {}
39void oopDesc::print_value()   {}
40void oopDesc::print_address() {}
41#else
42void oopDesc::print_on(outputStream* st) const {
43  if (this == NULL) {
44    st->print_cr("NULL");
45  } else {
46    blueprint()->oop_print_on(oop(this), st);
47  }
48}
49
50void oopDesc::print_value_on(outputStream* st) const {
51  oop obj = oop(this);
52  if (this == NULL) {
53    st->print("NULL");
54  } else if (java_lang_String::is_instance(obj)) {
55    java_lang_String::print(obj, st);
56    if (PrintOopAddress) print_address_on(st);
57#ifdef ASSERT
58  } else if (!Universe::heap()->is_in(obj) || !Universe::heap()->is_in(klass())) {
59    st->print("### BAD OOP %p ###", (address)obj);
60#endif
61  } else {
62    blueprint()->oop_print_value_on(obj, st);
63  }
64}
65
66void oopDesc::print_address_on(outputStream* st) const {
67  if (PrintOopAddress) {
68    st->print("{");
69    if (PrintOopAddress) {
70      st->print(INTPTR_FORMAT, this);
71    }
72    st->print("}");
73  }
74}
75
76void oopDesc::print()         { print_on(tty);         }
77
78void oopDesc::print_value()   { print_value_on(tty);   }
79
80void oopDesc::print_address() { print_address_on(tty); }
81
82char* oopDesc::print_string() {
83  stringStream* st = new stringStream();
84  print_on(st);
85  return st->as_string();
86}
87
88char* oopDesc::print_value_string() {
89  stringStream* st = new stringStream();
90  print_value_on(st);
91  return st->as_string();
92}
93
94#endif // PRODUCT
95
96void oopDesc::verify_on(outputStream* st) {
97  if (this != NULL) {
98    blueprint()->oop_verify_on(this, st);
99  }
100}
101
102
103void oopDesc::verify() {
104  verify_on(tty);
105}
106
107
108void oopDesc::verify_old_oop(oop* p, bool allow_dirty) {
109  blueprint()->oop_verify_old_oop(this, p, allow_dirty);
110}
111
112
113bool oopDesc::partially_loaded() {
114  return blueprint()->oop_partially_loaded(this);
115}
116
117
118void oopDesc::set_partially_loaded() {
119  blueprint()->oop_set_partially_loaded(this);
120}
121
122
123intptr_t oopDesc::slow_identity_hash() {
124  // slow case; we have to acquire the micro lock in order to locate the header
125  ResetNoHandleMark rnm; // Might be called from LEAF/QUICK ENTRY
126  HandleMark hm;
127  Handle object((oop)this);
128  assert(!is_shared_readonly(), "using identity hash on readonly object?");
129  return ObjectSynchronizer::identity_hash_value_for(object);
130}
131
132VerifyOopClosure VerifyOopClosure::verify_oop;
133