< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com

*** 184,193 **** --- 184,194 ---- } Node* generate_access_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region); Node* generate_interface_guard(Node* kls, RegionNode* region); + Node* generate_hidden_class_guard(Node* kls, RegionNode* region); Node* generate_array_guard(Node* kls, RegionNode* region) { return generate_array_guard_common(kls, region, false, false); } Node* generate_non_array_guard(Node* kls, RegionNode* region) { return generate_array_guard_common(kls, region, false, true);
*** 781,790 **** --- 782,792 ---- case vmIntrinsics::_isInstance: case vmIntrinsics::_getModifiers: case vmIntrinsics::_isInterface: case vmIntrinsics::_isArray: case vmIntrinsics::_isPrimitive: + case vmIntrinsics::_isHiddenClass: case vmIntrinsics::_getSuperclass: case vmIntrinsics::_getClassAccessFlags: return inline_native_Class_query(intrinsic_id()); case vmIntrinsics::_floatToRawIntBits: case vmIntrinsics::_floatToIntBits:
*** 3082,3091 **** --- 3084,3096 ---- return generate_fair_guard(bol, region); } Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) { return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region); } + Node* LibraryCallKit::generate_hidden_class_guard(Node* kls, RegionNode* region) { + return generate_access_flags_guard(kls, JVM_ACC_IS_HIDDEN_CLASS, 0, region); + } //-------------------------inline_native_Class_query------------------- bool LibraryCallKit::inline_native_Class_query(vmIntrinsics::ID id) { const Type* return_type = TypeInt::BOOL; Node* prim_return_value = top(); // what happens if it's a primitive class?
*** 3117,3126 **** --- 3122,3134 ---- break; case vmIntrinsics::_isPrimitive: prim_return_value = intcon(1); expect_prim = true; // obviously break; + case vmIntrinsics::_isHiddenClass: + prim_return_value = intcon(0); + break; case vmIntrinsics::_getSuperclass: prim_return_value = null(); return_type = TypeInstPtr::MIRROR->cast_to_ptr_type(TypePtr::BotPTR); break; case vmIntrinsics::_getClassAccessFlags:
*** 3209,3218 **** --- 3217,3236 ---- case vmIntrinsics::_isPrimitive: query_value = intcon(0); // "normal" path produces false break; + case vmIntrinsics::_isHiddenClass: + // (To verify this code sequence, check the asserts in JVM_IsHiddenClass.) + if (generate_hidden_class_guard(kls, region) != NULL) + // A guard was added. If the guard is taken, it was an hidden class. + phi->add_req(intcon(1)); + // If we fall through, it's a plain class. + query_value = intcon(0); + break; + + case vmIntrinsics::_getSuperclass: // The rules here are somewhat unfortunate, but we can still do better // with random logic than with a JNI call. // Interfaces store null or Object as _super, but must report null. // Arrays store an intermediate super as _super, but must report Object.
< prev index next >