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();