16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #ifndef SHARE_GC_SHARED_BARRIERSET_INLINE_HPP 25 #define SHARE_GC_SHARED_BARRIERSET_INLINE_HPP 26 27 #include "gc/shared/barrierSet.hpp" 28 #include "oops/accessDecorators.hpp" 29 #include "oops/arrayOop.hpp" 30 #include "oops/compressedOops.inline.hpp" 31 #include "oops/objArrayOop.inline.hpp" 32 #include "oops/oop.hpp" 33 34 template <DecoratorSet decorators, typename BarrierSetT> 35 template <typename T> 36 inline bool BarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, 37 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 38 size_t length) { 39 T* src = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); 40 T* dst = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); 41 42 if (!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) { 43 // Covariant, copy without checks 44 return Raw::oop_arraycopy(NULL, 0, src, NULL, 0, dst, length); 45 } 46 47 // Copy each element with checking casts 48 Klass* const dst_klass = objArrayOop(dst_obj)->element_klass(); 49 for (const T* const end = src + length; src < end; src++, dst++) { 50 const T elem = *src; 51 if (!oopDesc::is_instanceof_or_null(CompressedOops::decode(elem), dst_klass)) { 52 return false; 53 } 54 *dst = elem; 55 } 56 57 return true; 58 } 59 60 #endif // SHARE_GC_SHARED_BARRIERSET_INLINE_HPP | 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #ifndef SHARE_GC_SHARED_BARRIERSET_INLINE_HPP 25 #define SHARE_GC_SHARED_BARRIERSET_INLINE_HPP 26 27 #include "gc/shared/barrierSet.hpp" 28 #include "oops/accessDecorators.hpp" 29 #include "oops/arrayOop.hpp" 30 #include "oops/compressedOops.inline.hpp" 31 #include "oops/objArrayOop.inline.hpp" 32 #include "oops/oop.hpp" 33 34 template <DecoratorSet decorators, typename BarrierSetT> 35 template <typename T> 36 inline void BarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, 37 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 38 size_t length) { 39 T* src = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); 40 T* dst = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); 41 42 if ((!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) && 43 (!HasDecorator<decorators, ARRAYCOPY_NOTNULL>::value)) { 44 // Covariant, copy without checks 45 Raw::oop_arraycopy(NULL, 0, src, NULL, 0, dst, length); 46 return; 47 } 48 49 // Copy each element with checking casts 50 Klass* const dst_klass = objArrayOop(dst_obj)->element_klass(); 51 for (const T* const end = src + length; src < end; src++, dst++) { 52 const T elem = *src; 53 if (HasDecorator<decorators, ARRAYCOPY_NOTNULL>::value && CompressedOops::is_null(elem)) { 54 throw_array_null_pointer_store_exception(src_obj, dst_obj, Thread::current()); 55 return; 56 } 57 if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value && 58 (!oopDesc::is_instanceof_or_null(CompressedOops::decode(elem), dst_klass))) { 59 throw_array_store_exception(src_obj, dst_obj, Thread::current()); 60 return; 61 } 62 *dst = elem; 63 } 64 } 65 66 #endif // SHARE_GC_SHARED_BARRIERSET_INLINE_HPP |