< prev index next >

src/share/vm/runtime/stackValue.cpp

Print this page

        

@@ -100,12 +100,19 @@
         // saved long to the int that the JVM wants.
         value.noop =  (narrowOop) *(julong*) value_addr;
       } else {
         value.noop = *(narrowOop*) value_addr;
       }
-      // Decode narrowoop and wrap a handle around the oop
-      Handle h(oopDesc::decode_heap_oop(value.noop));
+      // Decode narrowoop
+      oop val = oopDesc::decode_heap_oop(value.noop);
+      // Deoptimization must make sure all oops have passed load barriers
+#if INCLUDE_ALL_GCS
+      if (UseShenandoahGC) {
+        val = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(val);
+      }
+#endif
+      Handle h(val); // Wrap a handle around the oop
       return new StackValue(h);
     }
 #endif
     case Location::oop: {
       oop val = *(oop *)value_addr;

@@ -116,10 +123,16 @@
          // The narrow_oop_base could be NULL or be the address
          // of the page below heap. Use NULL value for both cases.
          val = (oop)NULL;
       }
 #endif
+      // Deoptimization must make sure all oops have passed load barriers
+#if INCLUDE_ALL_GCS
+      if (UseShenandoahGC) {
+        val = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(val);
+      }
+#endif
       Handle h(val); // Wrap a handle around the oop
       return new StackValue(h);
     }
     case Location::addr: {
       ShouldNotReachHere(); // both C1 and C2 now inline jsrs
< prev index next >