src/share/vm/oops/oop.inline.hpp

changeset 1934
e9ff18c4ace7
parent 1907
c18cbe5936b8
parent 1926
2d127394260e
child 2201
d55217dc206f
     1.1 --- a/src/share/vm/oops/oop.inline.hpp	Tue Jun 01 11:48:33 2010 -0700
     1.2 +++ b/src/share/vm/oops/oop.inline.hpp	Wed Jun 02 22:45:42 2010 -0700
     1.3 @@ -146,8 +146,13 @@
     1.4  // offset from the heap base.  Saving the check for null can save instructions
     1.5  // in inner GC loops so these are separated.
     1.6  
     1.7 +inline bool check_obj_alignment(oop obj) {
     1.8 +  return (intptr_t)obj % MinObjAlignmentInBytes == 0;
     1.9 +}
    1.10 +
    1.11  inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
    1.12    assert(!is_null(v), "oop value can never be zero");
    1.13 +  assert(check_obj_alignment(v), "Address not aligned");
    1.14    assert(Universe::heap()->is_in_reserved(v), "Address not in heap");
    1.15    address base = Universe::narrow_oop_base();
    1.16    int    shift = Universe::narrow_oop_shift();
    1.17 @@ -167,7 +172,9 @@
    1.18    assert(!is_null(v), "narrow oop value can never be zero");
    1.19    address base = Universe::narrow_oop_base();
    1.20    int    shift = Universe::narrow_oop_shift();
    1.21 -  return (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift));
    1.22 +  oop result = (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift));
    1.23 +  assert(check_obj_alignment(result), "Address not aligned");
    1.24 +  return result;
    1.25  }
    1.26  
    1.27  inline oop oopDesc::decode_heap_oop(narrowOop v) {
    1.28 @@ -522,10 +529,6 @@
    1.29    return mark()->has_bias_pattern();
    1.30  }
    1.31  
    1.32 -inline bool check_obj_alignment(oop obj) {
    1.33 -  return (intptr_t)obj % MinObjAlignmentInBytes == 0;
    1.34 -}
    1.35 -
    1.36  
    1.37  // used only for asserts
    1.38  inline bool oopDesc::is_oop(bool ignore_mark_word) const {
    1.39 @@ -600,6 +603,8 @@
    1.40  
    1.41  // Used by scavengers
    1.42  inline void oopDesc::forward_to(oop p) {
    1.43 +  assert(check_obj_alignment(p),
    1.44 +         "forwarding to something not aligned");
    1.45    assert(Universe::heap()->is_in_reserved(p),
    1.46           "forwarding to something not in heap");
    1.47    markOop m = markOopDesc::encode_pointer_as_mark(p);
    1.48 @@ -609,6 +614,8 @@
    1.49  
    1.50  // Used by parallel scavengers
    1.51  inline bool oopDesc::cas_forward_to(oop p, markOop compare) {
    1.52 +  assert(check_obj_alignment(p),
    1.53 +         "forwarding to something not aligned");
    1.54    assert(Universe::heap()->is_in_reserved(p),
    1.55           "forwarding to something not in heap");
    1.56    markOop m = markOopDesc::encode_pointer_as_mark(p);

mercurial