< prev index next >

src/hotspot/share/gc/g1/g1ParScanThreadState.cpp

Print this page
@@ -230,11 +230,12 @@
    PartialArraySplitter::Claim claim =
      _partial_array_splitter.claim(state, _task_queue, stolen);
    G1HeapRegionAttr dest_attr = _g1h->region_attr(to_array);
    G1SkipCardEnqueueSetter x(&_scanner, dest_attr.is_new_survivor());
    // Process claimed task.
-   to_array->oop_iterate_range(&_scanner,
+   assert(to_array->is_refArray(), "Must be");
+   refArrayOop(to_array)->oop_iterate_range(&_scanner,
                                checked_cast<int>(claim._start),
                                checked_cast<int>(claim._end));
  }
  
  MAYBE_INLINE_EVACUATION

@@ -252,11 +253,12 @@
  
    assert(_scanner.skip_card_enqueue_set(), "must be");
    // Process the initial chunk.  No need to process the type in the
    // klass, as it will already be handled by processing the built-in
    // module.
-   to_array->oop_iterate_range(&_scanner, 0, checked_cast<int>(initial_chunk_size));
+   assert(to_array->is_refArray(), "Must be");
+   refArrayOop(to_array)->oop_iterate_range(&_scanner, 0, checked_cast<int>(initial_chunk_size));
  }
  
  MAYBE_INLINE_EVACUATION
  void G1ParScanThreadState::dispatch_task(ScannerTask task, bool stolen) {
    verify_task(task);

@@ -423,20 +425,20 @@
                                               G1HeapRegionAttr const region_attr,
                                               G1HeapRegionAttr const dest_attr,
                                               uint age) {
      // Most objects are not arrays, so do one array check rather than
      // checking for each array category for each object.
-     if (klass->is_array_klass()) {
+     if (klass->is_array_klass() && !klass->is_flatArray_klass()) {
        assert(!klass->is_stack_chunk_instance_klass(), "must be");
  
-       if (klass->is_objArray_klass()) {
+       if (klass->is_refArray_klass()) {
          start_partial_objarray(old, obj);
        } else {
          // Nothing needs to be done for typeArrays.  Body doesn't contain
          // any oops to scan, and the type in the klass will already be handled
          // by processing the built-in module.
-         assert(klass->is_typeArray_klass(), "invariant");
+         assert(klass->is_typeArray_klass() || klass->is_objArray_klass(), "invariant");
        }
        return;
      }
  
      ContinuationGCSupport::transform_stack_chunk(obj);
< prev index next >