< prev index next >

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

Print this page

        

*** 230,256 **** if (lh < Klass::_lh_neutral_value) { // Second most common case is arrays. We have to fetch the // length of the array, shift (multiply) it appropriately, // up to wordSize, add the header, and align to object size. size_t size_in_bytes; - #ifdef _M_IA64 - // The Windows Itanium Aug 2002 SDK hoists this load above - // the check for s < 0. An oop at the end of the heap will - // cause an access violation if this load is performed on a non - // array oop. Making the reference volatile prohibits this. - // (%%% please explain by what magic the length is actually fetched!) - volatile int *array_length; - array_length = (volatile int *)( (intptr_t)this + - arrayOopDesc::length_offset_in_bytes() ); - assert(array_length > 0, "Integer arithmetic problem somewhere"); - // Put into size_t to avoid overflow. - size_in_bytes = (size_t) array_length; - size_in_bytes = size_in_bytes << Klass::layout_helper_log2_element_size(lh); - #else size_t array_length = (size_t) ((arrayOop)this)->length(); size_in_bytes = array_length << Klass::layout_helper_log2_element_size(lh); - #endif size_in_bytes += Klass::layout_helper_header_size(lh); // This code could be simplified, but by keeping array_header_in_bytes // in units of bytes and doing it this way we can round up just once, // skipping the intermediate round to HeapWordSize. Cast the result --- 230,241 ----
< prev index next >