提交 727bb605 编写于 作者: S sspitsyn

8013942: JSR 292: assert(type() == T_OBJECT) failed: type check

Summary: A dead scope  of the local needs to be identified
Reviewed-by: coleenp, vlivanov, mgronlun
上级 ace52c6f
...@@ -244,10 +244,8 @@ void InterpreterOopMap::print() const { ...@@ -244,10 +244,8 @@ void InterpreterOopMap::print() const {
method()->print_value(); method()->print_value();
tty->print(" @ %d = [%d] { ", bci(), n); tty->print(" @ %d = [%d] { ", bci(), n);
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
#ifdef ENABLE_ZAP_DEAD_LOCALS
if (is_dead(i)) tty->print("%d+ ", i); if (is_dead(i)) tty->print("%d+ ", i);
else else
#endif
if (is_oop(i)) tty->print("%d ", i); if (is_oop(i)) tty->print("%d ", i);
} }
tty->print_cr("}"); tty->print_cr("}");
...@@ -402,13 +400,11 @@ void OopMapCacheEntry::set_mask(CellTypeState *vars, CellTypeState *stack, int s ...@@ -402,13 +400,11 @@ void OopMapCacheEntry::set_mask(CellTypeState *vars, CellTypeState *stack, int s
value |= (mask << oop_bit_number ); value |= (mask << oop_bit_number );
} }
#ifdef ENABLE_ZAP_DEAD_LOCALS
// set dead bit // set dead bit
if (!cell->is_live()) { if (!cell->is_live()) {
value |= (mask << dead_bit_number); value |= (mask << dead_bit_number);
assert(!cell->is_reference(), "dead value marked as oop"); assert(!cell->is_reference(), "dead value marked as oop");
} }
#endif
} }
// make sure last word is stored // make sure last word is stored
......
...@@ -66,19 +66,15 @@ class InterpreterOopMap: ResourceObj { ...@@ -66,19 +66,15 @@ class InterpreterOopMap: ResourceObj {
public: public:
enum { enum {
N = 2, // the number of words reserved N = 4, // the number of words reserved
// for inlined mask storage // for inlined mask storage
small_mask_limit = N * BitsPerWord, // the maximum number of bits small_mask_limit = N * BitsPerWord, // the maximum number of bits
// available for small masks, // available for small masks,
// small_mask_limit can be set to 0 // small_mask_limit can be set to 0
// for testing bit_mask allocation // for testing bit_mask allocation
#ifdef ENABLE_ZAP_DEAD_LOCALS
bits_per_entry = 2, bits_per_entry = 2,
dead_bit_number = 1, dead_bit_number = 1,
#else
bits_per_entry = 1,
#endif
oop_bit_number = 0 oop_bit_number = 0
}; };
...@@ -119,10 +115,6 @@ class InterpreterOopMap: ResourceObj { ...@@ -119,10 +115,6 @@ class InterpreterOopMap: ResourceObj {
void set_expression_stack_size(int sz) { _expression_stack_size = sz; } void set_expression_stack_size(int sz) { _expression_stack_size = sz; }
#ifdef ENABLE_ZAP_DEAD_LOCALS
bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; }
#endif
// Lookup // Lookup
bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; } bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; }
bool is_empty() const; bool is_empty() const;
...@@ -144,6 +136,7 @@ class InterpreterOopMap: ResourceObj { ...@@ -144,6 +136,7 @@ class InterpreterOopMap: ResourceObj {
void print() const; void print() const;
int number_of_entries() const { return mask_size() / bits_per_entry; } int number_of_entries() const { return mask_size() / bits_per_entry; }
bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; }
bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; } bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; }
int expression_stack_size() const { return _expression_stack_size; } int expression_stack_size() const { return _expression_stack_size; }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "precompiled.hpp" #include "precompiled.hpp"
#include "classfile/systemDictionary.hpp" #include "classfile/systemDictionary.hpp"
#include "interpreter/interpreter.hpp" #include "interpreter/interpreter.hpp"
#include "interpreter/oopMapCache.hpp"
#include "jvmtifiles/jvmtiEnv.hpp" #include "jvmtifiles/jvmtiEnv.hpp"
#include "memory/resourceArea.hpp" #include "memory/resourceArea.hpp"
#include "oops/instanceKlass.hpp" #include "oops/instanceKlass.hpp"
...@@ -744,6 +745,13 @@ bool VM_GetOrSetLocal::doit_prologue() { ...@@ -744,6 +745,13 @@ bool VM_GetOrSetLocal::doit_prologue() {
} }
void VM_GetOrSetLocal::doit() { void VM_GetOrSetLocal::doit() {
InterpreterOopMap oop_mask;
_jvf->method()->mask_for(_jvf->bci(), &oop_mask);
if (oop_mask.is_dead(_index)) {
// The local can be invalid and uninitialized in the scope of current bci
_result = JVMTI_ERROR_INVALID_SLOT;
return;
}
if (_set) { if (_set) {
// Force deoptimization of frame if compiled because it's // Force deoptimization of frame if compiled because it's
// possible the compiler emitted some locals as constant values, // possible the compiler emitted some locals as constant values,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册