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