< prev index next >

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

Print this page




 263 }
 264 
 265 
 266 // These functions are only used to exchange oop fields in instances,
 267 // not headers.
 268 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
 269   if (UseCompressedOops) {
 270     // encode exchange value from oop to T
 271     narrowOop val = encode_heap_oop(exchange_value);
 272     narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
 273     // decode old from T to oop
 274     return decode_heap_oop(old);
 275   } else {
 276     return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
 277   }
 278 }
 279 
 280 // In order to put or get a field out of an instance, must first check
 281 // if the field has been compressed and uncompress it.
 282 inline oop oopDesc::obj_field(int offset) const {

 283   return UseCompressedOops ?
 284     load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) :
 285     load_decode_heap_oop(obj_field_addr<oop>(offset));
 286 }
 287 
 288 inline void oopDesc::obj_field_put(int offset, oop value) {
 289   UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) :
 290                       oop_store(obj_field_addr<oop>(offset),       value);


 291 }
 292 
 293 inline Metadata* oopDesc::metadata_field(int offset) const {
 294   return *metadata_field_addr(offset);

 295 }
 296 
 297 inline void oopDesc::metadata_field_put(int offset, Metadata* value) {
 298   *metadata_field_addr(offset) = value;

 299 }
 300 
 301 inline void oopDesc::obj_field_put_raw(int offset, oop value) {


 302   UseCompressedOops ?
 303     encode_store_heap_oop(obj_field_addr<narrowOop>(offset), value) :
 304     encode_store_heap_oop(obj_field_addr<oop>(offset),       value);
 305 }
 306 inline void oopDesc::obj_field_put_volatile(int offset, oop value) {
 307   OrderAccess::release();
 308   obj_field_put(offset, value);
 309   OrderAccess::fence();
 310 }
 311 
 312 inline jbyte oopDesc::byte_field(int offset) const                  { return (jbyte) *byte_field_addr(offset);    }
 313 inline void oopDesc::byte_field_put(int offset, jbyte contents)     { *byte_field_addr(offset) = (jint) contents; }






 314 
 315 inline jboolean oopDesc::bool_field(int offset) const               { return (jboolean) *bool_field_addr(offset); }
 316 inline void oopDesc::bool_field_put(int offset, jboolean contents)  { *bool_field_addr(offset) = (jint) contents; }






 317 
 318 inline jchar oopDesc::char_field(int offset) const                  { return (jchar) *char_field_addr(offset);    }
 319 inline void oopDesc::char_field_put(int offset, jchar contents)     { *char_field_addr(offset) = (jint) contents; }






 320 
 321 inline jint oopDesc::int_field(int offset) const                    { return *int_field_addr(offset);        }
 322 inline void oopDesc::int_field_put(int offset, jint contents)       { *int_field_addr(offset) = contents;    }






 323 
 324 inline jshort oopDesc::short_field(int offset) const                { return (jshort) *short_field_addr(offset);  }
 325 inline void oopDesc::short_field_put(int offset, jshort contents)   { *short_field_addr(offset) = (jint) contents;}






 326 
 327 inline jlong oopDesc::long_field(int offset) const                  { return *long_field_addr(offset);       }
 328 inline void oopDesc::long_field_put(int offset, jlong contents)     { *long_field_addr(offset) = contents;   }






 329 
 330 inline jfloat oopDesc::float_field(int offset) const                { return *float_field_addr(offset);      }
 331 inline void oopDesc::float_field_put(int offset, jfloat contents)   { *float_field_addr(offset) = contents;  }






 332 
 333 inline jdouble oopDesc::double_field(int offset) const              { return *double_field_addr(offset);     }
 334 inline void oopDesc::double_field_put(int offset, jdouble contents) { *double_field_addr(offset) = contents; }






 335 
 336 inline address oopDesc::address_field(int offset) const              { return *address_field_addr(offset);     }
 337 inline void oopDesc::address_field_put(int offset, address contents) { *address_field_addr(offset) = contents; }






 338 
 339 inline oop oopDesc::obj_field_acquire(int offset) const {

 340   return UseCompressedOops ?
 341              decode_heap_oop((narrowOop)
 342                OrderAccess::load_acquire(obj_field_addr<narrowOop>(offset)))
 343            : decode_heap_oop((oop)
 344                OrderAccess::load_ptr_acquire(obj_field_addr<oop>(offset)));
 345 }
 346 inline void oopDesc::release_obj_field_put(int offset, oop value) {


 347   UseCompressedOops ?
 348     oop_store((volatile narrowOop*)obj_field_addr<narrowOop>(offset), value) :
 349     oop_store((volatile oop*)      obj_field_addr<oop>(offset),       value);
 350 }
 351 
 352 inline jbyte oopDesc::byte_field_acquire(int offset) const                  { return OrderAccess::load_acquire(byte_field_addr(offset));     }
 353 inline void oopDesc::release_byte_field_put(int offset, jbyte contents)     { OrderAccess::release_store(byte_field_addr(offset), contents); }






 354 
 355 inline jboolean oopDesc::bool_field_acquire(int offset) const               { return OrderAccess::load_acquire(bool_field_addr(offset));     }
 356 inline void oopDesc::release_bool_field_put(int offset, jboolean contents)  { OrderAccess::release_store(bool_field_addr(offset), contents); }






 357 
 358 inline jchar oopDesc::char_field_acquire(int offset) const                  { return OrderAccess::load_acquire(char_field_addr(offset));     }
 359 inline void oopDesc::release_char_field_put(int offset, jchar contents)     { OrderAccess::release_store(char_field_addr(offset), contents); }






 360 
 361 inline jint oopDesc::int_field_acquire(int offset) const                    { return OrderAccess::load_acquire(int_field_addr(offset));      }
 362 inline void oopDesc::release_int_field_put(int offset, jint contents)       { OrderAccess::release_store(int_field_addr(offset), contents);  }






 363 
 364 inline jshort oopDesc::short_field_acquire(int offset) const                { return (jshort)OrderAccess::load_acquire(short_field_addr(offset)); }
 365 inline void oopDesc::release_short_field_put(int offset, jshort contents)   { OrderAccess::release_store(short_field_addr(offset), contents);     }






 366 
 367 inline jlong oopDesc::long_field_acquire(int offset) const                  { return OrderAccess::load_acquire(long_field_addr(offset));       }
 368 inline void oopDesc::release_long_field_put(int offset, jlong contents)     { OrderAccess::release_store(long_field_addr(offset), contents);   }






 369 
 370 inline jfloat oopDesc::float_field_acquire(int offset) const                { return OrderAccess::load_acquire(float_field_addr(offset));      }
 371 inline void oopDesc::release_float_field_put(int offset, jfloat contents)   { OrderAccess::release_store(float_field_addr(offset), contents);  }






 372 
 373 inline jdouble oopDesc::double_field_acquire(int offset) const              { return OrderAccess::load_acquire(double_field_addr(offset));     }
 374 inline void oopDesc::release_double_field_put(int offset, jdouble contents) { OrderAccess::release_store(double_field_addr(offset), contents); }






 375 
 376 inline address oopDesc::address_field_acquire(int offset) const             { return (address) OrderAccess::load_ptr_acquire(address_field_addr(offset)); }
 377 inline void oopDesc::release_address_field_put(int offset, address contents) { OrderAccess::release_store_ptr(address_field_addr(offset), contents); }






 378 
 379 inline int oopDesc::size_given_klass(Klass* klass)  {
 380   int lh = klass->layout_helper();
 381   int s;
 382 
 383   // lh is now a value computed at class initialization that may hint
 384   // at the size.  For instances, this is positive and equal to the
 385   // size.  For arrays, this is negative and provides log2 of the
 386   // array element size.  For other oops, it is zero and thus requires
 387   // a virtual call.
 388   //
 389   // We go to all this trouble because the size computation is at the
 390   // heart of phase 2 of mark-compaction, and called for every object,
 391   // alive or dead.  So the speed here is equal in importance to the
 392   // speed of allocation.
 393 
 394   if (lh > Klass::_lh_neutral_value) {
 395     if (!Klass::layout_helper_needs_slow_path(lh)) {
 396       s = lh >> LogHeapWordSize;  // deliver size scaled by wordSize
 397     } else {




 263 }
 264 
 265 
 266 // These functions are only used to exchange oop fields in instances,
 267 // not headers.
 268 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
 269   if (UseCompressedOops) {
 270     // encode exchange value from oop to T
 271     narrowOop val = encode_heap_oop(exchange_value);
 272     narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
 273     // decode old from T to oop
 274     return decode_heap_oop(old);
 275   } else {
 276     return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
 277   }
 278 }
 279 
 280 // In order to put or get a field out of an instance, must first check
 281 // if the field has been compressed and uncompress it.
 282 inline oop oopDesc::obj_field(int offset) const {
 283   oop p = bs()->read_barrier((oop) this);
 284   return UseCompressedOops ?
 285     load_decode_heap_oop(p->obj_field_addr<narrowOop>(offset)) :
 286     load_decode_heap_oop(p->obj_field_addr<oop>(offset));
 287 }
 288 
 289 inline void oopDesc::obj_field_put(int offset, oop value) {
 290   oop p = bs()->write_barrier(this);
 291   value = bs()->read_barrier(value);
 292   UseCompressedOops ? oop_store(p->obj_field_addr<narrowOop>(offset), value) :
 293                       oop_store(p->obj_field_addr<oop>(offset),       value);
 294 }
 295 
 296 inline Metadata* oopDesc::metadata_field(int offset) const {
 297   oop p = bs()->read_barrier((oop) this);
 298   return *p->metadata_field_addr(offset);
 299 }
 300 
 301 inline void oopDesc::metadata_field_put(int offset, Metadata* value) {
 302   oop p = bs()->write_barrier(this);
 303   *p->metadata_field_addr(offset) = value;
 304 }
 305 
 306 inline void oopDesc::obj_field_put_raw(int offset, oop value) {
 307   oop p = bs()->write_barrier(this);
 308   value = bs()->read_barrier(value);
 309   UseCompressedOops ?
 310     encode_store_heap_oop(p->obj_field_addr<narrowOop>(offset), value) :
 311     encode_store_heap_oop(p->obj_field_addr<oop>(offset),       value);
 312 }
 313 inline void oopDesc::obj_field_put_volatile(int offset, oop value) {
 314   OrderAccess::release();
 315   obj_field_put(offset, value);
 316   OrderAccess::fence();
 317 }
 318 
 319 inline jbyte oopDesc::byte_field(int offset) const                  {
 320   oop p = bs()->read_barrier((oop) this);
 321   return (jbyte) *p->byte_field_addr(offset);
 322 }
 323 inline void oopDesc::byte_field_put(int offset, jbyte contents)     {
 324   oop p = bs()->write_barrier(this);
 325   *p->byte_field_addr(offset) = (jint) contents;
 326 }
 327 
 328 inline jboolean oopDesc::bool_field(int offset) const               {
 329   oop p = bs()->read_barrier((oop) this);
 330   return (jboolean) *p->bool_field_addr(offset);
 331 }
 332 inline void oopDesc::bool_field_put(int offset, jboolean contents)  {
 333   oop p = bs()->write_barrier(this);
 334   *p->bool_field_addr(offset) = (jint) contents;
 335 }
 336 
 337 inline jchar oopDesc::char_field(int offset) const                  {
 338   oop p = bs()->read_barrier((oop) this);
 339   return (jchar) *p->char_field_addr(offset);
 340 }
 341 inline void oopDesc::char_field_put(int offset, jchar contents)     {
 342   oop p = bs()->write_barrier(this);
 343   *p->char_field_addr(offset) = (jint) contents;
 344 }
 345 
 346 inline jint oopDesc::int_field(int offset) const                    {
 347   oop p = bs()->read_barrier((oop) this);
 348   return *p->int_field_addr(offset);
 349 }
 350 inline void oopDesc::int_field_put(int offset, jint contents)       {
 351   oop p = bs()->write_barrier(this);
 352   *p->int_field_addr(offset) = contents;
 353 }
 354 
 355 inline jshort oopDesc::short_field(int offset) const                {
 356   oop p = bs()->read_barrier((oop) this);
 357   return (jshort) *p->short_field_addr(offset);
 358 }
 359 inline void oopDesc::short_field_put(int offset, jshort contents)   {
 360   oop p = bs()->write_barrier(this);
 361   *p->short_field_addr(offset) = (jint) contents;
 362 }
 363 
 364 inline jlong oopDesc::long_field(int offset) const                  {
 365   oop p = bs()->read_barrier((oop) this);
 366   return *p->long_field_addr(offset);
 367 }
 368 inline void oopDesc::long_field_put(int offset, jlong contents)     {
 369   oop p = bs()->write_barrier(this);
 370   *p->long_field_addr(offset) = contents;
 371 }
 372 
 373 inline jfloat oopDesc::float_field(int offset) const                {
 374   oop p = bs()->read_barrier((oop) this);
 375   return *p->float_field_addr(offset);
 376 }
 377 inline void oopDesc::float_field_put(int offset, jfloat contents)   {
 378   oop p = bs()->write_barrier(this);
 379   *p->float_field_addr(offset) = contents;
 380 }
 381 
 382 inline jdouble oopDesc::double_field(int offset) const              {
 383   oop p = bs()->read_barrier((oop) this);
 384   return *p->double_field_addr(offset);
 385 }
 386 inline void oopDesc::double_field_put(int offset, jdouble contents) {
 387   oop p = bs()->write_barrier(this);
 388   *p->double_field_addr(offset) = contents;
 389 }
 390 
 391 inline address oopDesc::address_field(int offset) const              {
 392   oop p = bs()->read_barrier((oop) this);
 393   return *p->address_field_addr(offset);
 394 }
 395 inline void oopDesc::address_field_put(int offset, address contents) {
 396   oop p = bs()->write_barrier(this);
 397   *p->address_field_addr(offset) = contents;
 398 }
 399 
 400 inline oop oopDesc::obj_field_acquire(int offset) const {
 401   oop p = bs()->read_barrier((oop) this);
 402   return UseCompressedOops ?
 403              decode_heap_oop((narrowOop)
 404                OrderAccess::load_acquire(p->obj_field_addr<narrowOop>(offset)))
 405            : decode_heap_oop((oop)
 406                OrderAccess::load_ptr_acquire(p->obj_field_addr<oop>(offset)));
 407 }
 408 inline void oopDesc::release_obj_field_put(int offset, oop value) {
 409   oop p = bs()->write_barrier(this);
 410   value = bs()->read_barrier(value);
 411   UseCompressedOops ?
 412     oop_store((volatile narrowOop*)p->obj_field_addr<narrowOop>(offset), value) :
 413     oop_store((volatile oop*)      p->obj_field_addr<oop>(offset),       value);
 414 }
 415 
 416 inline jbyte oopDesc::byte_field_acquire(int offset) const                  {
 417   oop p = bs()->read_barrier((oop) this);
 418   return OrderAccess::load_acquire(p->byte_field_addr(offset));
 419 }
 420 inline void oopDesc::release_byte_field_put(int offset, jbyte contents)     {
 421   oop p = bs()->write_barrier(this);
 422   OrderAccess::release_store(p->byte_field_addr(offset), contents);
 423 }
 424 
 425 inline jboolean oopDesc::bool_field_acquire(int offset) const               {
 426   oop p = bs()->read_barrier((oop) this);
 427   return OrderAccess::load_acquire(p->bool_field_addr(offset));
 428 }
 429 inline void oopDesc::release_bool_field_put(int offset, jboolean contents)  {
 430   oop p = bs()->write_barrier(this);
 431   OrderAccess::release_store(p->bool_field_addr(offset), contents);
 432 }
 433 
 434 inline jchar oopDesc::char_field_acquire(int offset) const                  {
 435   oop p = bs()->read_barrier((oop) this);
 436   return OrderAccess::load_acquire(p->char_field_addr(offset));
 437 }
 438 inline void oopDesc::release_char_field_put(int offset, jchar contents)     {
 439   oop p = bs()->write_barrier(this);
 440   OrderAccess::release_store(p->char_field_addr(offset), contents);
 441 }
 442 
 443 inline jint oopDesc::int_field_acquire(int offset) const                    {
 444   oop p = bs()->read_barrier((oop) this);
 445   return OrderAccess::load_acquire(p->int_field_addr(offset));
 446 }
 447 inline void oopDesc::release_int_field_put(int offset, jint contents)       {
 448   oop p = bs()->write_barrier(this);
 449   OrderAccess::release_store(p->int_field_addr(offset), contents);
 450 }
 451 
 452 inline jshort oopDesc::short_field_acquire(int offset) const                {
 453   oop p = bs()->read_barrier((oop) this);
 454   return (jshort)OrderAccess::load_acquire(p->short_field_addr(offset));
 455 }
 456 inline void oopDesc::release_short_field_put(int offset, jshort contents)   {
 457   oop p = bs()->write_barrier(this);
 458   OrderAccess::release_store(p->short_field_addr(offset), contents);
 459 }
 460 
 461 inline jlong oopDesc::long_field_acquire(int offset) const                  {
 462   oop p = bs()->read_barrier((oop) this);
 463   return OrderAccess::load_acquire(p->long_field_addr(offset));
 464 }
 465 inline void oopDesc::release_long_field_put(int offset, jlong contents)     {
 466   oop p = bs()->write_barrier(this);
 467   OrderAccess::release_store(p->long_field_addr(offset), contents);
 468 }
 469 
 470 inline jfloat oopDesc::float_field_acquire(int offset) const                {
 471   oop p = bs()->read_barrier((oop) this);
 472   return OrderAccess::load_acquire(p->float_field_addr(offset));
 473 }
 474 inline void oopDesc::release_float_field_put(int offset, jfloat contents)   {
 475   oop p = bs()->write_barrier(this);
 476   OrderAccess::release_store(p->float_field_addr(offset), contents);
 477 }
 478 
 479 inline jdouble oopDesc::double_field_acquire(int offset) const              {
 480   oop p = bs()->read_barrier((oop) this);
 481   return OrderAccess::load_acquire(p->double_field_addr(offset));
 482 }
 483 inline void oopDesc::release_double_field_put(int offset, jdouble contents) {
 484   oop p = bs()->write_barrier(this);
 485   OrderAccess::release_store(p->double_field_addr(offset), contents);
 486 }
 487 
 488 inline address oopDesc::address_field_acquire(int offset) const             {
 489   oop p = bs()->read_barrier((oop) this);
 490   return (address) OrderAccess::load_ptr_acquire(p->address_field_addr(offset));
 491 }
 492 inline void oopDesc::release_address_field_put(int offset, address contents) {
 493   oop p = bs()->write_barrier(this);
 494   OrderAccess::release_store_ptr(p->address_field_addr(offset), contents);
 495 }
 496 
 497 inline int oopDesc::size_given_klass(Klass* klass)  {
 498   int lh = klass->layout_helper();
 499   int s;
 500 
 501   // lh is now a value computed at class initialization that may hint
 502   // at the size.  For instances, this is positive and equal to the
 503   // size.  For arrays, this is negative and provides log2 of the
 504   // array element size.  For other oops, it is zero and thus requires
 505   // a virtual call.
 506   //
 507   // We go to all this trouble because the size computation is at the
 508   // heart of phase 2 of mark-compaction, and called for every object,
 509   // alive or dead.  So the speed here is equal in importance to the
 510   // speed of allocation.
 511 
 512   if (lh > Klass::_lh_neutral_value) {
 513     if (!Klass::layout_helper_needs_slow_path(lh)) {
 514       s = lh >> LogHeapWordSize;  // deliver size scaled by wordSize
 515     } else {


< prev index next >