@@ -328,77 +328,89 @@ inline zaddress ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_copy_on
328328}
329329
330330template <DecoratorSet decorators, typename BarrierSetT>
331- inline void ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_copy_one(zpointer* dst, zpointer* src) {
331+ inline OopCopyResult ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_copy_one(zpointer* dst, zpointer* src) {
332332 const zaddress obj = oop_copy_one_barriers (dst, src);
333333
334+ // Future location for null-restriction check and failure reporting
335+
334336 AtomicAccess::store (dst, ZAddress::store_good (obj));
337+
338+ return OopCopyResult::ok;
335339}
336340
337341template <DecoratorSet decorators, typename BarrierSetT>
338- inline bool ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_copy_one_check_cast(zpointer* dst, zpointer* src, Klass* dst_klass) {
342+ inline OopCopyResult ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_copy_one_check_cast(zpointer* dst, zpointer* src, Klass* dst_klass) {
339343 const zaddress obj = oop_copy_one_barriers (dst, src);
340344
341345 if (!oopDesc::is_instanceof_or_null (to_oop (obj), dst_klass)) {
342346 // Check cast failed
343- return false ;
347+ return OopCopyResult::failed_check_class_cast ;
344348 }
345349
346350 AtomicAccess::store (dst, ZAddress::store_good (obj));
347351
348- return true ;
352+ return OopCopyResult::ok ;
349353}
350354
351355template <DecoratorSet decorators, typename BarrierSetT>
352- inline bool ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap_check_cast(zpointer* dst, zpointer* src, size_t length, Klass* dst_klass) {
356+ inline OopCopyResult ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap_check_cast(zpointer* dst, zpointer* src, size_t length, Klass* dst_klass) {
353357 // Check cast and copy each elements
354358 for (const zpointer* const end = src + length; src < end; src++, dst++) {
355- if (! oop_copy_one_check_cast (dst, src, dst_klass)) {
356- // Check cast failed
357- return false ;
359+ const OopCopyResult result = oop_copy_one_check_cast (dst, src, dst_klass);
360+ if (result != OopCopyResult::ok) {
361+ return result ;
358362 }
359363 }
360364
361- return true ;
365+ return OopCopyResult::ok ;
362366}
363367
364368template <DecoratorSet decorators, typename BarrierSetT>
365- inline bool ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap_no_check_cast(zpointer* dst, zpointer* src, size_t length) {
369+ inline OopCopyResult ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap_no_check_cast(zpointer* dst, zpointer* src, size_t length) {
366370 const bool is_disjoint = HasDecorator<decorators, ARRAYCOPY_DISJOINT>::value;
367371
368372 if (is_disjoint || src > dst) {
369373 for (const zpointer* const end = src + length; src < end; src++, dst++) {
370- oop_copy_one (dst, src);
374+ const OopCopyResult result = oop_copy_one (dst, src);
375+ if (result != OopCopyResult::ok) {
376+ return result;
377+ }
371378 }
372- return true ;
379+
380+ return OopCopyResult::ok;
373381 }
374382
375383 if (src < dst) {
376384 const zpointer* const end = src;
377385 src += length - 1 ;
378386 dst += length - 1 ;
379387 for ( ; src >= end; src--, dst--) {
380- oop_copy_one (dst, src);
388+ const OopCopyResult result = oop_copy_one (dst, src);
389+ if (result != OopCopyResult::ok) {
390+ return result;
391+ }
381392 }
382- return true ;
393+
394+ return OopCopyResult::ok;
383395 }
384396
385397 // src and dst are the same; nothing to do
386- return true ;
398+ return OopCopyResult::ok ;
387399}
388400
389401template <DecoratorSet decorators, typename BarrierSetT>
390- inline bool ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, zpointer* src_raw,
391- arrayOop dst_obj, size_t dst_offset_in_bytes, zpointer* dst_raw,
392- size_t length) {
402+ inline OopCopyResult ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, zpointer* src_raw,
403+ arrayOop dst_obj, size_t dst_offset_in_bytes, zpointer* dst_raw,
404+ size_t length) {
393405 zpointer* const src = arrayOopDesc::obj_offset_to_raw (src_obj, src_offset_in_bytes, src_raw);
394406 zpointer* const dst = arrayOopDesc::obj_offset_to_raw (dst_obj, dst_offset_in_bytes, dst_raw);
395407
396408 if (HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) {
397409 Klass* const dst_klass = objArrayOop (dst_obj)->element_klass ();
398410 return oop_arraycopy_in_heap_check_cast (dst, src, length, dst_klass);
411+ } else {
412+ return oop_arraycopy_in_heap_no_check_cast (dst, src, length);
399413 }
400-
401- return oop_arraycopy_in_heap_no_check_cast (dst, src, length);
402414}
403415
404416template <DecoratorSet decorators, typename BarrierSetT>
0 commit comments