< prev index next >
src/hotspot/share/runtime/frame.cpp
Print this page
*** 34,43 ****
--- 34,44 ----
#include "memory/universe.inline.hpp"
#include "oops/markOop.hpp"
#include "oops/method.hpp"
#include "oops/methodData.hpp"
#include "oops/oop.inline.hpp"
+ #include "oops/valueKlass.hpp"
#include "oops/verifyOopClosure.hpp"
#include "prims/methodHandles.hpp"
#include "runtime/frame.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/javaCalls.hpp"
*** 760,793 ****
frame* _fr;
OopClosure* _f;
BufferedValueClosure* _bvt_f;
int _max_locals;
int _max_stack;
public:
InterpreterFrameClosure(frame* fr, int max_locals, int max_stack,
OopClosure* f, BufferedValueClosure* bvt_f) {
_fr = fr;
_max_locals = max_locals;
_max_stack = max_stack;
_f = f;
_bvt_f = bvt_f;
}
void offset_do(int offset) {
oop* addr;
if (offset < _max_locals) {
addr = (oop*) _fr->interpreter_frame_local_at(offset);
assert((intptr_t*)addr >= _fr->sp(), "must be inside the frame");
! if (Universe::heap()->is_in_reserved_or_null(*addr)) {
if (_f != NULL) {
_f->do_oop(addr);
}
} else { // Buffered value types case
if (_f != NULL) {
! oop* addr_mirror = (oop*)(*addr)->mark_addr();
! _f->do_oop(addr_mirror);
}
if (_bvt_f != NULL) {
_bvt_f->do_buffered_value(addr);
}
}
--- 761,796 ----
frame* _fr;
OopClosure* _f;
BufferedValueClosure* _bvt_f;
int _max_locals;
int _max_stack;
+ BufferedValuesDealiaser* _dealiaser;
public:
InterpreterFrameClosure(frame* fr, int max_locals, int max_stack,
OopClosure* f, BufferedValueClosure* bvt_f) {
_fr = fr;
_max_locals = max_locals;
_max_stack = max_stack;
_f = f;
_bvt_f = bvt_f;
+ _dealiaser = NULL;
}
void offset_do(int offset) {
oop* addr;
if (offset < _max_locals) {
addr = (oop*) _fr->interpreter_frame_local_at(offset);
assert((intptr_t*)addr >= _fr->sp(), "must be inside the frame");
! if (!VTBuffer::is_in_vt_buffer(*addr)) {
if (_f != NULL) {
_f->do_oop(addr);
}
} else { // Buffered value types case
+ assert((*addr)->is_value(), "Only values can be buffered");
if (_f != NULL) {
! dealiaser()->oops_do(_f, *addr);
}
if (_bvt_f != NULL) {
_bvt_f->do_buffered_value(addr);
}
}
*** 800,817 ****
in_stack = (intptr_t*)addr <= _fr->interpreter_frame_tos_address();
} else {
in_stack = (intptr_t*)addr >= _fr->interpreter_frame_tos_address();
}
if (in_stack) {
! if (Universe::heap()->is_in_reserved_or_null(*addr)) {
if (_f != NULL) {
_f->do_oop(addr);
}
} else { // Buffered value types case
if (_f != NULL) {
! oop* addr_mirror = (oop*)(*addr)->mark_addr();
! _f->do_oop(addr_mirror);
}
if (_bvt_f != NULL) {
_bvt_f->do_buffered_value(addr);
}
}
--- 803,820 ----
in_stack = (intptr_t*)addr <= _fr->interpreter_frame_tos_address();
} else {
in_stack = (intptr_t*)addr >= _fr->interpreter_frame_tos_address();
}
if (in_stack) {
! if (!VTBuffer::is_in_vt_buffer(*addr)) {
if (_f != NULL) {
_f->do_oop(addr);
}
} else { // Buffered value types case
+ assert((*addr)->is_value(), "Only values can be buffered");
if (_f != NULL) {
! dealiaser()->oops_do(_f, *addr);
}
if (_bvt_f != NULL) {
_bvt_f->do_buffered_value(addr);
}
}
*** 819,847 ****
--- 822,865 ----
}
}
int max_locals() { return _max_locals; }
frame* fr() { return _fr; }
+
+ private:
+ BufferedValuesDealiaser* dealiaser() {
+ if (_dealiaser == NULL) {
+ _dealiaser = Thread::current()->buffered_values_dealiaser();
+ assert(_dealiaser != NULL, "Must not be NULL");
+ }
+ return _dealiaser;
+ }
};
class InterpretedArgumentOopFinder: public SignatureInfo {
private:
OopClosure* _f; // Closure to invoke
int _offset; // TOS-relative offset, decremented with each argument
bool _has_receiver; // true if the callee has a receiver
frame* _fr;
+ BufferedValuesDealiaser* _dealiaser;
void set(int size, BasicType type) {
_offset -= size;
if (type == T_OBJECT || type == T_ARRAY || type == T_VALUETYPE) oop_offset_do();
}
void oop_offset_do() {
oop* addr;
addr = (oop*)_fr->interpreter_frame_tos_at(_offset);
+ if (!VTBuffer::is_in_vt_buffer(*addr)) {
_f->do_oop(addr);
+ } else { // Buffered value types case
+ assert((*addr)->is_value(), "Only values can be buffered");
+ dealiaser()->oops_do(_f, *addr);
+ }
}
public:
InterpretedArgumentOopFinder(Symbol* signature, bool has_receiver, frame* fr, OopClosure* f) : SignatureInfo(signature), _has_receiver(has_receiver) {
// compute size of arguments
*** 851,860 ****
--- 869,887 ----
"args cannot be on stack anymore");
// initialize InterpretedArgumentOopFinder
_f = f;
_fr = fr;
_offset = args_size;
+ _dealiaser = NULL;
+ }
+
+ BufferedValuesDealiaser* dealiaser() {
+ if (_dealiaser == NULL) {
+ _dealiaser = Thread::current()->buffered_values_dealiaser();
+ assert(_dealiaser != NULL, "Must not be NULL");
+ }
+ return _dealiaser;
}
void oops_do() {
if (_has_receiver) {
--_offset;
*** 881,909 ****
--- 908,951 ----
private:
bool _is_static;
int _offset;
frame* _fr;
OopClosure* _f;
+ BufferedValuesDealiaser* _dealiaser;
+
+ BufferedValuesDealiaser* dealiaser() {
+ if (_dealiaser == NULL) {
+ _dealiaser = Thread::current()->buffered_values_dealiaser();
+ assert(_dealiaser != NULL, "Must not be NULL");
+ }
+ return _dealiaser;
+ }
void set(int size, BasicType type) {
assert (_offset >= 0, "illegal offset");
if (type == T_OBJECT || type == T_ARRAY || type == T_VALUETYPE) oop_at_offset_do(_offset);
_offset -= size;
}
void oop_at_offset_do(int offset) {
assert (offset >= 0, "illegal offset");
oop* addr = (oop*) _fr->entry_frame_argument_at(offset);
+ if (!VTBuffer::is_in_vt_buffer(*addr)) {
_f->do_oop(addr);
+ } else { // Buffered value types case
+ assert((*addr)->is_value(), "Only values can be buffered");
+ dealiaser()->oops_do(_f, *addr);
+ }
}
public:
EntryFrameOopFinder(frame* frame, Symbol* signature, bool is_static) : SignatureInfo(signature) {
_f = NULL; // will be set later
_fr = frame;
_is_static = is_static;
_offset = ArgumentSizeComputer(signature).size() - 1; // last parameter is at index 0
+ _dealiaser = NULL;
}
void arguments_do(OopClosure* f) {
_f = f;
if (!_is_static) oop_at_offset_do(_offset+1); // do the receiver
*** 944,953 ****
--- 986,996 ----
#endif
current->oops_do(f);
}
if (m->is_native()) {
+ assert(!VTBuffer::is_in_vt_buffer((oopDesc*)*interpreter_frame_temp_oop_addr()), "Sanity check");
f->do_oop(interpreter_frame_temp_oop_addr());
}
// The method pointer in the frame might be the only path to the method's
// klass, and the klass needs to be kept alive while executing. The GCs
*** 1050,1059 ****
--- 1093,1111 ----
bool _has_appendix; // true if the call has an appendix
frame _fr;
RegisterMap* _reg_map;
int _arg_size;
VMRegPair* _regs; // VMReg list of arguments
+ BufferedValuesDealiaser* _dealiaser;
+
+ BufferedValuesDealiaser* dealiaser() {
+ if (_dealiaser == NULL) {
+ _dealiaser = Thread::current()->buffered_values_dealiaser();
+ assert(_dealiaser != NULL, "Must not be NULL");
+ }
+ return _dealiaser;
+ }
void set(int size, BasicType type) {
if (type == T_OBJECT || type == T_ARRAY || type == T_VALUETYPE) handle_oop_offset();
_offset += size;
}
*** 1062,1072 ****
--- 1114,1129 ----
// 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);
+ if (!VTBuffer::is_in_vt_buffer(*loc)) {
_f->do_oop(loc);
+ } else { // Buffered value types case
+ assert((*loc)->is_value(), "Only values can be buffered");
+ dealiaser()->oops_do(_f, *loc);
+ }
}
public:
CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, bool has_appendix, OopClosure* f, frame fr, const RegisterMap* reg_map)
: SignatureInfo(signature) {
*** 1077,1086 ****
--- 1134,1144 ----
_has_receiver = has_receiver;
_has_appendix = has_appendix;
_fr = fr;
_reg_map = (RegisterMap*)reg_map;
_regs = SharedRuntime::find_callee_arguments(signature, has_receiver, has_appendix, &_arg_size);
+ _dealiaser = NULL;
}
void oops_do() {
if (_has_receiver) {
handle_oop_offset();
< prev index next >