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);