1669 ciKlass *ss = klass->super_of_depth(depth); |
1669 ciKlass *ss = klass->super_of_depth(depth); |
1670 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; |
1670 return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR; |
1671 } |
1671 } |
1672 const Type* aift = load_array_final_field(tkls, klass); |
1672 const Type* aift = load_array_final_field(tkls, klass); |
1673 if (aift != NULL) return aift; |
1673 if (aift != NULL) return aift; |
1674 if (tkls->offset() == in_bytes(arrayKlass::component_mirror_offset()) |
1674 if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset()) |
1675 && klass->is_array_klass()) { |
1675 && klass->is_array_klass()) { |
1676 // The field is arrayKlass::_component_mirror. Return its (constant) value. |
1676 // The field is ArrayKlass::_component_mirror. Return its (constant) value. |
1677 // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.) |
1677 // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.) |
1678 assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror"); |
1678 assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror"); |
1679 return TypeInstPtr::make(klass->as_array_klass()->component_mirror()); |
1679 return TypeInstPtr::make(klass->as_array_klass()->component_mirror()); |
1680 } |
1680 } |
1681 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { |
1681 if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) { |
2012 if (tkls != NULL && !StressReflectiveCode) { |
2012 if (tkls != NULL && !StressReflectiveCode) { |
2013 ciKlass* klass = tkls->klass(); |
2013 ciKlass* klass = tkls->klass(); |
2014 if( !klass->is_loaded() ) |
2014 if( !klass->is_loaded() ) |
2015 return _type; // Bail out if not loaded |
2015 return _type; // Bail out if not loaded |
2016 if( klass->is_obj_array_klass() && |
2016 if( klass->is_obj_array_klass() && |
2017 tkls->offset() == in_bytes(objArrayKlass::element_klass_offset())) { |
2017 tkls->offset() == in_bytes(ObjArrayKlass::element_klass_offset())) { |
2018 ciKlass* elem = klass->as_obj_array_klass()->element_klass(); |
2018 ciKlass* elem = klass->as_obj_array_klass()->element_klass(); |
2019 // // Always returning precise element type is incorrect, |
2019 // // Always returning precise element type is incorrect, |
2020 // // e.g., element type could be object and array may contain strings |
2020 // // e.g., element type could be object and array may contain strings |
2021 // return TypeKlassPtr::make(TypePtr::Constant, elem, 0); |
2021 // return TypeKlassPtr::make(TypePtr::Constant, elem, 0); |
2022 |
2022 |
2065 return allocated_klass; |
2065 return allocated_klass; |
2066 } |
2066 } |
2067 } |
2067 } |
2068 |
2068 |
2069 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. |
2069 // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*. |
2070 // Simplify ak.component_mirror.array_klass to plain ak, ak an arrayKlass. |
2070 // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass. |
2071 // See inline_native_Class_query for occurrences of these patterns. |
2071 // See inline_native_Class_query for occurrences of these patterns. |
2072 // Java Example: x.getClass().isAssignableFrom(y) |
2072 // Java Example: x.getClass().isAssignableFrom(y) |
2073 // Java Example: Array.newInstance(x.getClass().getComponentType(), n) |
2073 // Java Example: Array.newInstance(x.getClass().getComponentType(), n) |
2074 // |
2074 // |
2075 // This improves reflective code, often making the Class |
2075 // This improves reflective code, often making the Class |
2078 // introducing a new debug info operator for Klass*.java_mirror). |
2078 // introducing a new debug info operator for Klass*.java_mirror). |
2079 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() |
2079 if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass() |
2080 && (offset == java_lang_Class::klass_offset_in_bytes() || |
2080 && (offset == java_lang_Class::klass_offset_in_bytes() || |
2081 offset == java_lang_Class::array_klass_offset_in_bytes())) { |
2081 offset == java_lang_Class::array_klass_offset_in_bytes())) { |
2082 // We are loading a special hidden field from a Class mirror, |
2082 // We are loading a special hidden field from a Class mirror, |
2083 // the field which points to its Klass or arrayKlass metaobject. |
2083 // the field which points to its Klass or ArrayKlass metaobject. |
2084 if (base->is_Load()) { |
2084 if (base->is_Load()) { |
2085 Node* adr2 = base->in(MemNode::Address); |
2085 Node* adr2 = base->in(MemNode::Address); |
2086 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); |
2086 const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr(); |
2087 if (tkls != NULL && !tkls->empty() |
2087 if (tkls != NULL && !tkls->empty() |
2088 && (tkls->klass()->is_instance_klass() || |
2088 && (tkls->klass()->is_instance_klass() || |
2089 tkls->klass()->is_array_klass()) |
2089 tkls->klass()->is_array_klass()) |
2090 && adr2->is_AddP() |
2090 && adr2->is_AddP() |
2091 ) { |
2091 ) { |
2092 int mirror_field = in_bytes(Klass::java_mirror_offset()); |
2092 int mirror_field = in_bytes(Klass::java_mirror_offset()); |
2093 if (offset == java_lang_Class::array_klass_offset_in_bytes()) { |
2093 if (offset == java_lang_Class::array_klass_offset_in_bytes()) { |
2094 mirror_field = in_bytes(arrayKlass::component_mirror_offset()); |
2094 mirror_field = in_bytes(ArrayKlass::component_mirror_offset()); |
2095 } |
2095 } |
2096 if (tkls->offset() == mirror_field) { |
2096 if (tkls->offset() == mirror_field) { |
2097 return adr2->in(AddPNode::Base); |
2097 return adr2->in(AddPNode::Base); |
2098 } |
2098 } |
2099 } |
2099 } |