< 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,10 +184,11 @@
}
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,10 +782,11 @@
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,10 +3084,13 @@
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,10 +3122,13 @@
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,10 +3217,20 @@
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 >