< prev index next >
src/hotspot/share/opto/type.cpp
Print this page
@@ -609,10 +609,12 @@
false, 0, Offset(oopDesc::klass_offset_in_bytes()));
TypeOopPtr::BOTTOM = TypeOopPtr::make(TypePtr::BotPTR, Offset::bottom, TypeOopPtr::InstanceBot);
TypeMetadataPtr::BOTTOM = TypeMetadataPtr::make(TypePtr::BotPTR, NULL, Offset::bottom);
+ TypeValueType::BOTTOM = TypeValueType::make(NULL);
+
TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR );
TypeNarrowOop::BOTTOM = TypeNarrowOop::make( TypeInstPtr::BOTTOM );
TypeNarrowKlass::NULL_PTR = TypeNarrowKlass::make( TypePtr::NULL_PTR );
@@ -645,10 +647,11 @@
TypeAryPtr::CHARS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::CHAR ,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR), true, Offset::bottom);
TypeAryPtr::INTS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::INT ,TypeInt::POS), ciTypeArrayKlass::make(T_INT), true, Offset::bottom);
TypeAryPtr::LONGS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeLong::LONG ,TypeInt::POS), ciTypeArrayKlass::make(T_LONG), true, Offset::bottom);
TypeAryPtr::FLOATS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::FLOAT ,TypeInt::POS), ciTypeArrayKlass::make(T_FLOAT), true, Offset::bottom);
TypeAryPtr::DOUBLES = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::DOUBLE ,TypeInt::POS), ciTypeArrayKlass::make(T_DOUBLE), true, Offset::bottom);
+ TypeAryPtr::VALUES = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeValueType::BOTTOM,TypeInt::POS), NULL, false, Offset::bottom);
// Nobody should ask _array_body_type[T_NARROWOOP]. Use NULL as assert.
TypeAryPtr::_array_body_type[T_NARROWOOP] = NULL;
TypeAryPtr::_array_body_type[T_OBJECT] = TypeAryPtr::OOPS;
TypeAryPtr::_array_body_type[T_VALUETYPE] = TypeAryPtr::OOPS;
@@ -2384,10 +2387,12 @@
return false;
}
//==============================TypeValueType=======================================
+const TypeValueType *TypeValueType::BOTTOM;
+
//------------------------------make-------------------------------------------
const TypeValueType* TypeValueType::make(ciValueKlass* vk, bool larval) {
return (TypeValueType*)(new TypeValueType(vk, larval))->hashcons();
}
@@ -2435,11 +2440,15 @@
}
case ValueType: {
// All value types inherit from Object
const TypeValueType* other = t->is_valuetype();
- if (_vk == other->_vk) {
+ if (_vk == NULL) {
+ return this;
+ } else if (other->_vk == NULL) {
+ return other;
+ } else if (_vk == other->_vk) {
if (_larval == other->_larval ||
!_larval) {
return this;
} else {
return t;
@@ -2486,10 +2495,14 @@
}
//------------------------------dump2------------------------------------------
#ifndef PRODUCT
void TypeValueType::dump2(Dict &d, uint depth, outputStream* st) const {
+ if (_vk == NULL) {
+ st->print("BOTTOM valuetype");
+ return;
+ }
int count = _vk->nof_declared_nonstatic_fields();
st->print("valuetype[%d]:{", count);
st->print("%s", count != 0 ? _vk->declared_nonstatic_field_at(0)->type()->name() : "empty");
for (int i = 1; i < count; ++i) {
st->print(", %s", _vk->declared_nonstatic_field_at(i)->type()->name());
@@ -4349,10 +4362,11 @@
const TypeAryPtr *TypeAryPtr::CHARS;
const TypeAryPtr *TypeAryPtr::INTS;
const TypeAryPtr *TypeAryPtr::LONGS;
const TypeAryPtr *TypeAryPtr::FLOATS;
const TypeAryPtr *TypeAryPtr::DOUBLES;
+const TypeAryPtr *TypeAryPtr::VALUES;
//------------------------------make-------------------------------------------
const TypeAryPtr* TypeAryPtr::make(PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, Offset offset, Offset field_offset,
int instance_id, const TypePtr* speculative, int inline_depth) {
assert(!(k == NULL && ary->_elem->isa_int()),
@@ -5344,11 +5358,13 @@
if (el->isa_instptr()) {
// Compute object array klass from element klass
bool null_free = el->is_valuetypeptr() && el->isa_instptr()->ptr() != TypePtr::TopPTR && !el->isa_instptr()->maybe_null();
k_ary = ciArrayKlass::make(el->is_oopptr()->klass(), null_free);
} else if (el->isa_valuetype()) {
+ if (el->value_klass() != NULL) {
k_ary = ciArrayKlass::make(el->value_klass(), /* null_free */ true);
+ }
} else if ((tary = el->isa_aryptr()) != NULL) {
// Compute array klass from element klass
ciKlass* k_elem = tary->klass();
// If element type is something like bottom[], k_elem will be null.
if (k_elem != NULL)
< prev index next >