comparison src/share/vm/oops/oop.inline.hpp @ 1579:e9ff18c4ace7

Merge
author jrose
date Wed, 02 Jun 2010 22:45:42 -0700
parents c18cbe5936b8 2d127394260e
children d55217dc206f
comparison
equal deleted inserted replaced
1562:dfe27f03244a 1579:e9ff18c4ace7
144 144
145 // Algorithm for encoding and decoding oops from 64 bit pointers to 32 bit 145 // Algorithm for encoding and decoding oops from 64 bit pointers to 32 bit
146 // offset from the heap base. Saving the check for null can save instructions 146 // offset from the heap base. Saving the check for null can save instructions
147 // in inner GC loops so these are separated. 147 // in inner GC loops so these are separated.
148 148
149 inline bool check_obj_alignment(oop obj) {
150 return (intptr_t)obj % MinObjAlignmentInBytes == 0;
151 }
152
149 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { 153 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
150 assert(!is_null(v), "oop value can never be zero"); 154 assert(!is_null(v), "oop value can never be zero");
155 assert(check_obj_alignment(v), "Address not aligned");
151 assert(Universe::heap()->is_in_reserved(v), "Address not in heap"); 156 assert(Universe::heap()->is_in_reserved(v), "Address not in heap");
152 address base = Universe::narrow_oop_base(); 157 address base = Universe::narrow_oop_base();
153 int shift = Universe::narrow_oop_shift(); 158 int shift = Universe::narrow_oop_shift();
154 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); 159 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1));
155 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); 160 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding");
165 170
166 inline oop oopDesc::decode_heap_oop_not_null(narrowOop v) { 171 inline oop oopDesc::decode_heap_oop_not_null(narrowOop v) {
167 assert(!is_null(v), "narrow oop value can never be zero"); 172 assert(!is_null(v), "narrow oop value can never be zero");
168 address base = Universe::narrow_oop_base(); 173 address base = Universe::narrow_oop_base();
169 int shift = Universe::narrow_oop_shift(); 174 int shift = Universe::narrow_oop_shift();
170 return (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift)); 175 oop result = (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift));
176 assert(check_obj_alignment(result), "Address not aligned");
177 return result;
171 } 178 }
172 179
173 inline oop oopDesc::decode_heap_oop(narrowOop v) { 180 inline oop oopDesc::decode_heap_oop(narrowOop v) {
174 return is_null(v) ? (oop)NULL : decode_heap_oop_not_null(v); 181 return is_null(v) ? (oop)NULL : decode_heap_oop_not_null(v);
175 } 182 }
520 527
521 inline bool oopDesc::has_bias_pattern() const { 528 inline bool oopDesc::has_bias_pattern() const {
522 return mark()->has_bias_pattern(); 529 return mark()->has_bias_pattern();
523 } 530 }
524 531
525 inline bool check_obj_alignment(oop obj) {
526 return (intptr_t)obj % MinObjAlignmentInBytes == 0;
527 }
528
529 532
530 // used only for asserts 533 // used only for asserts
531 inline bool oopDesc::is_oop(bool ignore_mark_word) const { 534 inline bool oopDesc::is_oop(bool ignore_mark_word) const {
532 oop obj = (oop) this; 535 oop obj = (oop) this;
533 if (!check_obj_alignment(obj)) return false; 536 if (!check_obj_alignment(obj)) return false;
598 return mark()->is_marked(); 601 return mark()->is_marked();
599 } 602 }
600 603
601 // Used by scavengers 604 // Used by scavengers
602 inline void oopDesc::forward_to(oop p) { 605 inline void oopDesc::forward_to(oop p) {
606 assert(check_obj_alignment(p),
607 "forwarding to something not aligned");
603 assert(Universe::heap()->is_in_reserved(p), 608 assert(Universe::heap()->is_in_reserved(p),
604 "forwarding to something not in heap"); 609 "forwarding to something not in heap");
605 markOop m = markOopDesc::encode_pointer_as_mark(p); 610 markOop m = markOopDesc::encode_pointer_as_mark(p);
606 assert(m->decode_pointer() == p, "encoding must be reversable"); 611 assert(m->decode_pointer() == p, "encoding must be reversable");
607 set_mark(m); 612 set_mark(m);
608 } 613 }
609 614
610 // Used by parallel scavengers 615 // Used by parallel scavengers
611 inline bool oopDesc::cas_forward_to(oop p, markOop compare) { 616 inline bool oopDesc::cas_forward_to(oop p, markOop compare) {
617 assert(check_obj_alignment(p),
618 "forwarding to something not aligned");
612 assert(Universe::heap()->is_in_reserved(p), 619 assert(Universe::heap()->is_in_reserved(p),
613 "forwarding to something not in heap"); 620 "forwarding to something not in heap");
614 markOop m = markOopDesc::encode_pointer_as_mark(p); 621 markOop m = markOopDesc::encode_pointer_as_mark(p);
615 assert(m->decode_pointer() == p, "encoding must be reversable"); 622 assert(m->decode_pointer() == p, "encoding must be reversable");
616 return cas_set_mark(m, compare) == compare; 623 return cas_set_mark(m, compare) == compare;