--- old/src/hotspot/share/compiler/oopMap.cpp 2017-10-31 09:39:45.272955701 -0400 +++ new/src/hotspot/share/compiler/oopMap.cpp 2017-10-31 09:39:45.056954630 -0400 @@ -31,6 +31,7 @@ #include "gc/shared/collectedHeap.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" +#include "oops/valueKlass.hpp" #include "runtime/frame.inline.hpp" #include "runtime/signature.hpp" #include "utilities/align.hpp" @@ -368,6 +369,7 @@ // We want coop and oop oop_types int mask = OopMapValue::oop_value | OopMapValue::narrowoop_value; + BufferedValuesDealiaser* dealiaser = NULL; { for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) { omv = oms.current(); @@ -389,7 +391,8 @@ } #ifdef ASSERT if ((((uintptr_t)loc & (sizeof(*loc)-1)) != 0) || - !Universe::heap()->is_in_or_null(*loc)) { + (!Universe::heap()->is_in_or_null(*loc) + && !VTBuffer::is_in_vt_buffer(*loc))) { tty->print_cr("# Found non oop pointer. Dumping state at failure"); // try to dump out some helpful debugging information trace_codeblob_maps(fr, reg_map); @@ -398,10 +401,19 @@ omv.reg()->print(); tty->print_cr("loc = %p *loc = %p\n", loc, (address)*loc); // do the real assert. - assert(Universe::heap()->is_in_or_null(*loc), "found non oop pointer"); + assert(Universe::heap()->is_in_or_null(*loc) || VTBuffer::is_in_vt_buffer(*loc), + "found non oop pointer"); } #endif // ASSERT - oop_fn->do_oop(loc); + if (!VTBuffer::is_in_vt_buffer(*loc)) { + oop_fn->do_oop(loc); + } else { + assert((*loc)->is_value(), "Sanity check"); + if (dealiaser == NULL) { + dealiaser = Thread::current()->buffered_values_dealiaser(); + } + dealiaser->oops_do(oop_fn, *loc); + } } else if ( omv.type() == OopMapValue::narrowoop_value ) { narrowOop *nl = (narrowOop*)loc; #ifndef VM_LITTLE_ENDIAN