Change Class::component_type_ and implement reflect.Array
Change-Id: I9e06f31577551c738eca2621146c8d2328119442
diff --git a/src/object.h b/src/object.h
index 055e6a9..a04fcbb 100644
--- a/src/object.h
+++ b/src/object.h
@@ -413,7 +413,7 @@
uint32_t monitor_;
friend class ImageWriter; // for abusing monitor_ directly
- friend class ObjectOffsets; // for verifying offset information
+ friend struct ObjectOffsets; // for verifying offset information
DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
};
@@ -1386,23 +1386,10 @@
size_t PrimitiveSize() const;
bool IsArrayClass() const {
- return GetArrayRank() != 0;
- }
-
- int32_t GetArrayRank() const {
- int32_t result = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, array_rank_),
- false);
- return result;
- }
-
- void SetArrayRank(int32_t new_array_rank) {
- DCHECK_EQ(0, GetArrayRank());
- SetField32(OFFSET_OF_OBJECT_MEMBER(Class, array_rank_), new_array_rank,
- false);
+ return GetComponentType() != NULL;
}
Class* GetComponentType() const {
- DCHECK(IsArrayClass());
return GetFieldObject<Class*>(
OFFSET_OF_OBJECT_MEMBER(Class, component_type_), false);
}
@@ -1499,20 +1486,20 @@
return that->IsPublic() || this->IsInSamePackage(that);
}
- bool IsAssignableFrom(const Class* klass) const {
- DCHECK(klass != NULL);
- if (this == klass) {
+ bool IsAssignableFrom(const Class* src) const {
+ DCHECK(src != NULL);
+ if (this == src) {
// Can always assign to things of the same type
return true;
} else if (IsObjectClass()) {
// Can assign any reference to java.lang.Object
- return !klass->IsPrimitive();
+ return !src->IsPrimitive();
} else if (IsInterface()) {
- return klass->Implements(this);
- } else if (klass->IsArrayClass()) {
- return IsAssignableFromArray(klass);
+ return src->Implements(this);
+ } else if (src->IsArrayClass()) {
+ return IsAssignableFromArray(src);
} else {
- return klass->IsSubClass(this);
+ return src->IsSubClass(this);
}
}
@@ -1912,9 +1899,8 @@
// defining class loader, or NULL for the "bootstrap" system loader
const ClassLoader* class_loader_;
- // For array classes, the class object for base element, for
- // instanceof/checkcast (for String[][][], this will be String).
- // Otherwise, NULL.
+ // For array classes, the component class object for instanceof/checkcast
+ // (for String[][][], this will be String[][]). NULL for non-array classes.
Class* component_type_;
// descriptor for the class such as "Ljava/lang/Class;" or "[C"
@@ -1988,10 +1974,6 @@
// access flags; low 16 bits are defined by VM spec
uint32_t access_flags_;
- // For array classes, the number of array dimensions, e.g. int[][]
- // is 2. Otherwise 0.
- int32_t array_rank_;
-
// Total class size; used when allocating storage on gc heap.
size_t class_size_;
@@ -2243,6 +2225,7 @@
class MANAGED ClassClass : public Class {
private:
+ int32_t padding_;
int64_t serialVersionUID_;
friend struct ClassClassOffsets; // for verifying offset information
DISALLOW_IMPLICIT_CONSTRUCTORS(ClassClass);
@@ -2252,8 +2235,8 @@
private:
CharArray* ASCII_;
Object* CASE_INSENSITIVE_ORDER_;
- int64_t serialVersionUID_;
uint32_t REPLACEMENT_CHAR_;
+ int64_t serialVersionUID_;
friend struct StringClassOffsets; // for verifying offset information
DISALLOW_IMPLICIT_CONSTRUCTORS(StringClass);
};