src/share/vm/runtime/frame.cpp

Print this page
rev 4267 : 8009981: nashorn tests fail with -XX:+VerifyStack
Summary: nmethod::preserve_callee_argument_oops() must take appendix into account.
Reviewed-by:

*** 1006,1015 **** --- 1006,1016 ---- class CompiledArgumentOopFinder: public SignatureInfo { protected: OopClosure* _f; int _offset; // the current offset, incremented with each argument bool _has_receiver; // true if the callee has a receiver + bool _has_appendix; // true if the call has an appendix frame _fr; RegisterMap* _reg_map; int _arg_size; VMRegPair* _regs; // VMReg list of arguments
*** 1025,1062 **** oop *loc = _fr.oopmapreg_to_location(reg, _reg_map); _f->do_oop(loc); } public: ! CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, OopClosure* f, frame fr, const RegisterMap* reg_map) : SignatureInfo(signature) { // initialize CompiledArgumentOopFinder _f = f; _offset = 0; _has_receiver = has_receiver; _fr = fr; _reg_map = (RegisterMap*)reg_map; ! _arg_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0); int arg_size; ! _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, &arg_size); assert(arg_size == _arg_size, "wrong arg size"); } void oops_do() { if (_has_receiver) { handle_oop_offset(); _offset++; } iterate_parameters(); } }; ! void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, const RegisterMap* reg_map, OopClosure* f) { ResourceMark rm; ! CompiledArgumentOopFinder finder(signature, has_receiver, f, *this, reg_map); finder.oops_do(); } // Get receiver out of callers frame, i.e. find parameter 0 in callers --- 1026,1067 ---- 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) : SignatureInfo(signature) { // initialize CompiledArgumentOopFinder _f = f; _offset = 0; _has_receiver = has_receiver; + _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"); } void oops_do() { if (_has_receiver) { handle_oop_offset(); _offset++; } iterate_parameters(); + if (_has_appendix) { + handle_oop_offset(); + } } }; ! void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, const RegisterMap* reg_map, OopClosure* f) { ResourceMark rm; ! CompiledArgumentOopFinder finder(signature, has_receiver, has_appendix, f, *this, reg_map); finder.oops_do(); } // Get receiver out of callers frame, i.e. find parameter 0 in callers