Merge "More threads work." into dalvik-dev
diff --git a/src/class_loader.h b/src/class_loader.h
index 80435c6..80444f5 100644
--- a/src/class_loader.h
+++ b/src/class_loader.h
@@ -11,6 +11,7 @@
namespace art {
// C++ mirror of java.lang.ClassLoader
+// TODO: add MANAGED when class_path_ removed
class ClassLoader : public Object {
public:
static const std::vector<const DexFile*>& GetClassPath(const ClassLoader* class_loader);
@@ -34,6 +35,7 @@
};
// C++ mirror of dalvik.system.BaseDexClassLoader
+// TODO: add MANAGED when class_path_ removed
class BaseDexClassLoader : public ClassLoader {
private:
// Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
@@ -45,6 +47,7 @@
};
// C++ mirror of dalvik.system.PathClassLoader
+// TODO: add MANAGED when class_path_ removed
class PathClassLoader : public BaseDexClassLoader {
public:
static const PathClassLoader* Alloc(std::vector<const DexFile*> dex_files);
diff --git a/src/dex_cache.h b/src/dex_cache.h
index 0ac2ee1..7662a7d0 100644
--- a/src/dex_cache.h
+++ b/src/dex_cache.h
@@ -17,7 +17,7 @@
class String;
union JValue;
-class CodeAndDirectMethods : public IntArray {
+class MANAGED CodeAndDirectMethods : public IntArray {
public:
void* GetResolvedCode(uint32_t method_idx) const {
return reinterpret_cast<byte*>(Get(CodeIndex(method_idx)));
@@ -78,7 +78,7 @@
DISALLOW_IMPLICIT_CONSTRUCTORS(CodeAndDirectMethods);
};
-class DexCache : public ObjectArray<Object> {
+class MANAGED DexCache : public ObjectArray<Object> {
public:
void Init(String* location,
ObjectArray<String>* strings,
diff --git a/src/object.h b/src/object.h
index b7cbee5..94adf60 100644
--- a/src/object.h
+++ b/src/object.h
@@ -170,8 +170,12 @@
#define OFFSET_OF_OBJECT_MEMBER(type, field) \
MemberOffset(OFFSETOF_MEMBER(type, field))
+// Classes shared with the managed side of the world need to be packed
+// so that they don't have extra platform specific padding.
+#define MANAGED __attribute__ ((__packed__))
+
// C++ mirror of java.lang.Object
-class Object {
+class MANAGED Object {
public:
static bool InstanceOf(const Object* object, const Class* klass) {
if (object == NULL) {
@@ -475,7 +479,7 @@
};
// C++ mirror of java.lang.reflect.AccessibleObject
-class AccessibleObject : public Object {
+class MANAGED AccessibleObject : public Object {
private:
// Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
uint32_t java_flag_; // can accessibility checks be bypassed
@@ -484,7 +488,7 @@
};
// C++ mirror of java.lang.reflect.Field
-class Field : public AccessibleObject {
+class MANAGED Field : public AccessibleObject {
public:
Class* GetDeclaringClass() const;
@@ -621,7 +625,7 @@
};
// C++ mirror of java.lang.reflect.Method
-class Method : public AccessibleObject {
+class MANAGED Method : public AccessibleObject {
public:
// An function that invokes a method with an array of its arguments.
typedef void InvokeStub(const Method* method,
@@ -1101,7 +1105,7 @@
DISALLOW_IMPLICIT_CONSTRUCTORS(Method);
};
-class Array : public Object {
+class MANAGED Array : public Object {
public:
static size_t SizeOf(size_t component_count,
size_t component_size) {
@@ -1165,7 +1169,7 @@
};
template<class T>
-class ObjectArray : public Array {
+class MANAGED ObjectArray : public Array {
public:
static ObjectArray<T>* Alloc(Class* object_array_class, int32_t length);
@@ -1212,10 +1216,10 @@
// provides the static storage. However, this might change to an Array
// to improve image sharing, so we use this type to avoid assumptions
// on the current storage.
-class StaticStorageBase : public Object {};
+class MANAGED StaticStorageBase : public Object {};
// C++ mirror of java.lang.Class
-class Class : public StaticStorageBase {
+class MANAGED Class : public StaticStorageBase {
public:
// Class Status
@@ -1499,7 +1503,10 @@
}
void SetClassSize(size_t new_class_size) {
- DCHECK_GE(new_class_size, GetClassSize());
+ DCHECK(new_class_size >= GetClassSize())
+ << " class=" << PrettyType(this)
+ << " new_class_size=" << new_class_size
+ << " GetClassSize=" << GetClassSize();
SetField32(OFFSET_OF_OBJECT_MEMBER(Class, class_size_), new_class_size,
false);
}
@@ -2281,14 +2288,14 @@
}
}
-class ClassClass : public Class {
+class MANAGED ClassClass : public Class {
private:
int64_t serialVersionUID_;
friend struct ClassClassOffsets; // for verifying offset information
DISALLOW_IMPLICIT_CONSTRUCTORS(ClassClass);
};
-class StringClass : public Class {
+class MANAGED StringClass : public Class {
private:
CharArray* ASCII_;
Object* CASE_INSENSITIVE_ORDER_;
@@ -2298,7 +2305,7 @@
DISALLOW_IMPLICIT_CONSTRUCTORS(StringClass);
};
-class FieldClass : public Class {
+class MANAGED FieldClass : public Class {
private:
Object* ORDER_BY_NAME_AND_DECLARING_CLASS_;
uint32_t TYPE_BOOLEAN_;
@@ -2313,7 +2320,7 @@
DISALLOW_IMPLICIT_CONSTRUCTORS(FieldClass);
};
-class MethodClass : public Class {
+class MANAGED MethodClass : public Class {
private:
ObjectArray<Object>* NO_ANNOTATIONS_;
Object* ORDER_BY_SIGNATURE_;
@@ -2322,7 +2329,7 @@
};
template<class T>
-class PrimitiveArray : public Array {
+class MANAGED PrimitiveArray : public Array {
public:
typedef T ElementType;
@@ -2378,7 +2385,7 @@
}
// C++ mirror of java.lang.String
-class String : public Object {
+class MANAGED String : public Object {
public:
const CharArray* GetCharArray() const {
const CharArray* result = GetFieldObject<const CharArray*>(
@@ -2609,7 +2616,7 @@
}
// C++ mirror of java.lang.Throwable
-class Throwable : public Object {
+class MANAGED Throwable : public Object {
public:
void SetDetailMessage(String* new_detail_message) {
SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Throwable, detail_message_),
@@ -2629,7 +2636,7 @@
};
// C++ mirror of java.lang.StackTraceElement
-class StackTraceElement : public Object {
+class MANAGED StackTraceElement : public Object {
public:
const String* GetDeclaringClass() const {
return GetFieldObject<const String*>(
@@ -2678,7 +2685,7 @@
DISALLOW_IMPLICIT_CONSTRUCTORS(StackTraceElement);
};
- class InterfaceEntry : public ObjectArray<Object> {
+class MANAGED InterfaceEntry : public ObjectArray<Object> {
public:
Class* GetInterface() const {
Class* interface = Get(kInterface)->AsClass();