src/share/vm/opto/parseHelper.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/parseHelper.cpp Fri Jun 16 14:34:20 2017
--- new/src/share/vm/opto/parseHelper.cpp Fri Jun 16 14:34:20 2017
*** 25,34 ****
--- 25,35 ----
#include "precompiled.hpp"
#include "ci/ciValueKlass.hpp"
#include "classfile/systemDictionary.hpp"
#include "compiler/compileLog.hpp"
#include "oops/objArrayKlass.hpp"
+ #include "oops/valueArrayKlass.hpp"
#include "opto/addnode.hpp"
#include "opto/memnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/parse.hpp"
#include "opto/rootnode.hpp"
*** 137,147 ****
--- 138,148 ----
push(res);
}
//------------------------------array_store_check------------------------------
// pull array from stack and check that the store is valid
! void Parse::array_store_check(bool target_is_valuetypearray) {
// Shorthand access to array store elements without popping them.
Node *obj = peek(0);
Node *idx = peek(1);
Node *ary = peek(2);
*** 221,241 ****
--- 222,256 ----
}
// Come here for polymorphic array klasses
// Extract the array element class
- int element_klass_offset = in_bytes(ObjArrayKlass::element_klass_offset());
+
Node *p2 = basic_plus_adr(array_klass, array_klass, element_klass_offset);
// We are allowed to use the constant type only if cast succeeded. If always_see_exact_class is true,
// we must set a control edge from the IfTrue node created by the uncommon_trap above to the
// LoadKlassNode.
Node* a_e_klass = _gvn.transform(LoadKlassNode::make(_gvn, always_see_exact_class ? control() : NULL,
immutable_memory(), p2, tak));
+ if (target_is_valuetypearray) {
+ ciKlass* target_elem_klass = gvn().type(a_e_klass)->is_klassptr()->klass();
+ ciKlass* source_klass = gvn().type(obj)->is_valuetype()->value_klass();
+ if (!target_elem_klass->equals(source_klass)) {
+ Node* slow_ctl = type_check(a_e_klass, TypeKlassPtr::make(source_klass), 1.0);
+ {
+ PreserveJVMState pjvms(this);
+ set_control(slow_ctl);
+ builtin_throw(Deoptimization::Reason_class_check);
+ }
+ }
+ } else {
// Check (the hard way) and throw if not a subklass.
// Result is ignored, we just need the CFG effects.
gen_checkcast(obj, a_e_klass);
+ }
}
void Parse::emit_guard_for_new(ciInstanceKlass* klass) {
// Emit guarded new
src/share/vm/opto/parseHelper.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File