--- old/src/share/vm/runtime/frame.cpp 2017-05-15 17:07:20.962606399 +0200 +++ new/src/share/vm/runtime/frame.cpp 2017-05-15 17:07:20.826606403 +0200 @@ -1006,13 +1006,14 @@ virtual void handle_oop_offset() { // Extract low order register number from register array. // In LP64-land, the high-order bits are valid but unhelpful. + assert(_offset < _arg_size, "out of bounds"); VMReg reg = _regs[_offset].first(); oop *loc = _fr.oopmapreg_to_location(reg, _reg_map); _f->do_oop(loc); } public: - CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, bool has_appendix, OopClosure* f, frame fr, const RegisterMap* reg_map) + CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, bool has_appendix, OopClosure* f, frame fr, const RegisterMap* reg_map) : SignatureInfo(signature) { // initialize CompiledArgumentOopFinder @@ -1022,11 +1023,7 @@ _has_appendix = has_appendix; _fr = fr; _reg_map = (RegisterMap*)reg_map; - _arg_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0) + (has_appendix ? 1 : 0); - - int arg_size; - _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, has_appendix, &arg_size); - assert(arg_size == _arg_size, "wrong arg size"); + _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, has_appendix, &_arg_size); } void oops_do() {