Move the remaining non-compiler VM code into C++.

Change-Id: Id8693208d2741c55a7b0474d1264f2112019d11f
diff --git a/vm/AllocTracker.c b/vm/AllocTracker.cpp
similarity index 97%
rename from vm/AllocTracker.c
rename to vm/AllocTracker.cpp
index 8e2c325..c65ac4d 100644
--- a/vm/AllocTracker.c
+++ b/vm/AllocTracker.cpp
@@ -184,16 +184,18 @@
 /*
  * Add a new allocation to the set.
  */
-void dvmDoTrackAllocation(ClassObject* clazz, int size)
+void dvmDoTrackAllocation(ClassObject* clazz, size_t size)
 {
-    dvmLockMutex(&gDvm.allocTrackerLock);
-    if (gDvm.allocRecords == NULL)
-        goto bail;
-
     Thread* self = dvmThreadSelf();
     if (self == NULL) {
         LOGW("alloc tracker: no thread\n");
-        goto bail;
+        return;
+    }
+
+    dvmLockMutex(&gDvm.allocTrackerLock);
+    if (gDvm.allocRecords == NULL) {
+        dvmUnlockMutex(&gDvm.allocTrackerLock);
+        return;
     }
 
     /* advance and clip */
@@ -210,7 +212,6 @@
     if (gDvm.allocRecordCount < kNumAllocRecords)
         gDvm.allocRecordCount++;
 
-bail:
     dvmUnlockMutex(&gDvm.allocTrackerLock);
 }
 
@@ -600,8 +601,10 @@
         dvmEnableAllocTracker();
 
     dvmLockMutex(&gDvm.allocTrackerLock);
-    if (gDvm.allocRecords == NULL)
-        goto bail;
+    if (gDvm.allocRecords == NULL) {
+        dvmUnlockMutex(&gDvm.allocTrackerLock);
+        return;
+    }
 
     /*
      * "idx" is the head of the list.  We want to start at the end of the
@@ -618,8 +621,7 @@
             pRec->threadId, pRec->size, pRec->clazz->descriptor);
 
         if (true) {
-            int i;
-            for (i = 0; i < kMaxAllocRecordStackDepth; i++) {
+            for (int i = 0; i < kMaxAllocRecordStackDepth; i++) {
                 if (pRec->stackElem[i].method == NULL)
                     break;
 
@@ -642,7 +644,6 @@
         idx = (idx + 1) & (kNumAllocRecords-1);
     }
 
-bail:
     dvmUnlockMutex(&gDvm.allocTrackerLock);
     if (false) {
         u1* data;
diff --git a/vm/AllocTracker.h b/vm/AllocTracker.h
index b6d668d..fa8ba75 100644
--- a/vm/AllocTracker.h
+++ b/vm/AllocTracker.h
@@ -48,7 +48,7 @@
         if (gDvm.allocRecords != NULL)                                      \
             dvmDoTrackAllocation(_clazz, _size);                            \
     }
-void dvmDoTrackAllocation(ClassObject* clazz, int size);
+void dvmDoTrackAllocation(ClassObject* clazz, size_t size);
 
 /*
  * Generate a DDM packet with all of the tracked allocation data.
diff --git a/vm/Atomic.c b/vm/Atomic.cpp
similarity index 100%
rename from vm/Atomic.c
rename to vm/Atomic.cpp
diff --git a/vm/AtomicCache.c b/vm/AtomicCache.cpp
similarity index 100%
rename from vm/AtomicCache.c
rename to vm/AtomicCache.cpp
diff --git a/vm/BitVector.c b/vm/BitVector.cpp
similarity index 100%
rename from vm/BitVector.c
rename to vm/BitVector.cpp
diff --git a/vm/Ddm.c b/vm/Ddm.cpp
similarity index 98%
rename from vm/Ddm.c
rename to vm/Ddm.cpp
index 1251fe2..23561fd 100644
--- a/vm/Ddm.c
+++ b/vm/Ddm.cpp
@@ -284,7 +284,7 @@
         set4BE(&buf[0x04], stringLen);
 
         /* copy the UTF-16 string, transforming to big-endian */
-        outChars = (u2*) &buf[0x08];
+        outChars = (u2*)(void*)&buf[0x08];
         while (stringLen--)
             set2BE((u1*) (outChars++), *chars++);
     } else {
@@ -320,7 +320,7 @@
 
     set4BE(&buf[0x00], threadId);
     set4BE(&buf[0x04], stringLen);
-    u2* outChars = (u2*) &buf[0x08];
+    u2* outChars = (u2*)(void*)&buf[0x08];
     while (stringLen--)
         set2BE((u1*) (outChars++), *chars++);
 
diff --git a/vm/Debugger.c b/vm/Debugger.cpp
similarity index 97%
rename from vm/Debugger.c
rename to vm/Debugger.cpp
index 0f01647..ebe4149 100644
--- a/vm/Debugger.c
+++ b/vm/Debugger.cpp
@@ -459,7 +459,8 @@
  */
 int dvmDbgThreadRunning(void)
 {
-    return dvmChangeStatus(NULL, THREAD_RUNNING);
+    ThreadStatus oldStatus = dvmChangeStatus(NULL, THREAD_RUNNING);
+    return static_cast<int>(oldStatus);
 }
 
 /*
@@ -467,7 +468,8 @@
  */
 int dvmDbgThreadWaiting(void)
 {
-    return dvmChangeStatus(NULL, THREAD_VMWAIT);
+    ThreadStatus oldStatus = dvmChangeStatus(NULL, THREAD_VMWAIT);
+    return static_cast<int>(oldStatus);
 }
 
 /*
@@ -475,7 +477,9 @@
  */
 int dvmDbgThreadContinuing(int status)
 {
-    return dvmChangeStatus(NULL, status);
+    ThreadStatus newStatus = static_cast<ThreadStatus>(status);
+    ThreadStatus oldStatus = dvmChangeStatus(NULL, newStatus);
+    return static_cast<int>(oldStatus);
 }
 
 /*
@@ -1173,36 +1177,32 @@
 void dvmDbgOutputAllFields(RefTypeId refTypeId, bool withGeneric,
     ExpandBuf* pReply)
 {
-    static const u1 genericSignature[1] = "";
-    ClassObject* clazz;
-    Field* field;
-    u4 declared;
-    int i;
-
-    clazz = refTypeIdToClassObject(refTypeId);
+    ClassObject* clazz = refTypeIdToClassObject(refTypeId);
     assert(clazz != NULL);
 
-    declared = clazz->sfieldCount + clazz->ifieldCount;
+    u4 declared = clazz->sfieldCount + clazz->ifieldCount;
     expandBufAdd4BE(pReply, declared);
 
-    for (i = 0; i < clazz->sfieldCount; i++) {
-        field = (Field*) &clazz->sfields[i];
-
+    for (int i = 0; i < clazz->sfieldCount; i++) {
+        Field* field = &clazz->sfields[i].field;
         expandBufAddFieldId(pReply, fieldToFieldId(field));
         expandBufAddUtf8String(pReply, (const u1*) field->name);
         expandBufAddUtf8String(pReply, (const u1*) field->signature);
-        if (withGeneric)
+        if (withGeneric) {
+            static const u1 genericSignature[1] = "";
             expandBufAddUtf8String(pReply, genericSignature);
+        }
         expandBufAdd4BE(pReply, augmentedAccessFlags(field->accessFlags));
     }
-    for (i = 0; i < clazz->ifieldCount; i++) {
-        field = (Field*) &clazz->ifields[i];
-
+    for (int i = 0; i < clazz->ifieldCount; i++) {
+        Field* field = (Field*)&clazz->ifields[i].field;
         expandBufAddFieldId(pReply, fieldToFieldId(field));
         expandBufAddUtf8String(pReply, (const u1*) field->name);
         expandBufAddUtf8String(pReply, (const u1*) field->signature);
-        if (withGeneric)
+        if (withGeneric) {
+            static const u1 genericSignature[1] = "";
             expandBufAddUtf8String(pReply, genericSignature);
+        }
         expandBufAdd4BE(pReply, augmentedAccessFlags(field->accessFlags));
     }
 }
@@ -2635,21 +2635,17 @@
     u4 options, u1* pResultTag, u8* pResultValue, ObjectId* pExceptObj)
 {
     Object* threadObj = objectIdToObject(threadId);
-    Thread* targetThread;
-    JdwpError err = ERR_NONE;
 
     dvmLockThreadList(NULL);
 
-    targetThread = threadObjToThread(threadObj);
+    Thread* targetThread = threadObjToThread(threadObj);
     if (targetThread == NULL) {
-        err = ERR_INVALID_THREAD;       /* thread does not exist */
         dvmUnlockThreadList();
-        goto bail;
+        return ERR_INVALID_THREAD;       /* thread does not exist */
     }
     if (!targetThread->invokeReq.ready) {
-        err = ERR_INVALID_THREAD;       /* thread not stopped by event */
         dvmUnlockThreadList();
-        goto bail;
+        return ERR_INVALID_THREAD;       /* thread not stopped by event */
     }
 
     /*
@@ -2671,9 +2667,8 @@
              "for method exec\n",
             dvmThreadSelf()->threadId, targetThread->threadId,
             targetThread->interpBreak.ctl.suspendCount);
-        err = ERR_THREAD_SUSPENDED;     /* probably not expected here */
         dvmUnlockThreadList();
-        goto bail;
+        return ERR_THREAD_SUSPENDED;     /* probably not expected here */
     }
 
     /*
@@ -2704,7 +2699,7 @@
      * the invokeReq mutex, although that should never be held for long.
      */
     Thread* self = dvmThreadSelf();
-    int oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
+    ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
 
     LOGV("    Transferring control to event thread\n");
     dvmLockMutex(&targetThread->invokeReq.lock);
@@ -2760,10 +2755,7 @@
         *pResultValue = objectToObjectId(tmpObj);
     }
     *pExceptObj = targetThread->invokeReq.exceptObj;
-    err = targetThread->invokeReq.err;
-
-bail:
-    return err;
+    return targetThread->invokeReq.err;
 }
 
 /*
@@ -2786,7 +2778,7 @@
     Thread* self = dvmThreadSelf();
     const Method* meth;
     Object* oldExcept;
-    int oldStatus;
+    ThreadStatus oldStatus;
 
     /*
      * We can be called while an exception is pending in the VM.  We need
diff --git a/vm/Dvm.mk b/vm/Dvm.mk
index 97a317b..1eb1cef 100644
--- a/vm/Dvm.mk
+++ b/vm/Dvm.mk
@@ -85,37 +85,37 @@
 #LOCAL_CFLAGS += -DWITH_JNI_STACK_CHECK
 
 LOCAL_SRC_FILES := \
-	AllocTracker.c \
-	Atomic.c.arm \
-	AtomicCache.c \
-	BitVector.c.arm \
+	AllocTracker.cpp \
+	Atomic.cpp.arm \
+	AtomicCache.cpp \
+	BitVector.cpp.arm \
 	CheckJni.cpp \
-	Ddm.c \
-	Debugger.c \
-	DvmDex.c \
-	Exception.c \
-	Hash.c \
-	IndirectRefTable.c.arm \
-	Init.c \
-	InitRefs.c \
-	InlineNative.c.arm \
-	Inlines.c \
-	Intern.c \
+	Ddm.cpp \
+	Debugger.cpp \
+	DvmDex.cpp \
+	Exception.cpp \
+	Hash.cpp \
+	IndirectRefTable.cpp.arm \
+	Init.cpp \
+	InitRefs.cpp \
+	InlineNative.cpp.arm \
+	Inlines.cpp \
+	Intern.cpp \
 	Jni.cpp \
-	JarFile.c \
-	LinearAlloc.c \
-	Misc.c \
-	Native.c \
-	PointerSet.c \
-	Profile.c \
-	Properties.c \
-	RawDexFile.c \
-	ReferenceTable.c \
-	SignalCatcher.c \
-	StdioConverter.c \
-	Sync.c \
-	Thread.c \
-	UtfString.c \
+	JarFile.cpp \
+	LinearAlloc.cpp \
+	Misc.cpp \
+	Native.cpp \
+	PointerSet.cpp \
+	Profile.cpp \
+	Properties.cpp \
+	RawDexFile.cpp \
+	ReferenceTable.cpp \
+	SignalCatcher.cpp \
+	StdioConverter.cpp \
+	Sync.cpp \
+	Thread.cpp \
+	UtfString.cpp \
 	alloc/Alloc.cpp \
 	alloc/CardTable.cpp \
 	alloc/HeapBitmap.cpp.arm \
@@ -146,7 +146,7 @@
 	jdwp/JdwpHandler.cpp \
 	jdwp/JdwpMain.cpp \
 	jdwp/JdwpSocket.cpp \
-	mterp/Mterp.c.arm \
+	mterp/Mterp.cpp.arm \
 	mterp/out/InterpC-portable.c.arm \
 	native/InternalNative.cpp \
 	native/dalvik_bytecode_OpcodeInfo.cpp \
@@ -186,9 +186,9 @@
 	reflect/Annotation.cpp \
 	reflect/Proxy.cpp \
 	reflect/Reflect.cpp \
-	test/AtomicTest.c.arm \
-	test/TestHash.c \
-	test/TestIndirectRefTable.c
+	test/AtomicTest.cpp.arm \
+	test/TestHash.cpp \
+	test/TestIndirectRefTable.cpp
 
 WITH_COPYING_GC := $(strip $(WITH_COPYING_GC))
 
diff --git a/vm/DvmDex.c b/vm/DvmDex.cpp
similarity index 100%
rename from vm/DvmDex.c
rename to vm/DvmDex.cpp
diff --git a/vm/Exception.c b/vm/Exception.cpp
similarity index 99%
rename from vm/Exception.c
rename to vm/Exception.cpp
index 740f5a6..281873e 100644
--- a/vm/Exception.c
+++ b/vm/Exception.cpp
@@ -888,7 +888,7 @@
             assert(dvmCheckException(dvmThreadSelf()));
             goto bail;
         }
-        intPtr = (int*) stackData->contents;
+        intPtr = (int*)(void*)stackData->contents;
     } else {
         /* array of ints; first entry is stack depth */
         assert(sizeof(Method*) == sizeof(int));
@@ -950,7 +950,7 @@
 {
     const ArrayObject* stackData = (const ArrayObject*) ostackData;
     size_t stackSize = stackData->length / 2;
-    const int* intVals = (const int*) stackData->contents;
+    const int* intVals = (const int*)(void*)stackData->contents;
     return dvmGetStackTraceRaw(intVals, stackSize);
 }
 
@@ -1189,7 +1189,7 @@
     }
 
     stackSize = stackData->length / 2;
-    intVals = (const int*) stackData->contents;
+    intVals = (const int*)(void*)stackData->contents;
 
     dvmLogRawStackTrace(intVals, stackSize);
 }
diff --git a/vm/Globals.h b/vm/Globals.h
index 163ce99..0415305 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -95,7 +95,7 @@
 
     bool        jdwpAllowed;        // debugging allowed for this process?
     bool        jdwpConfigured;     // has debugging info been provided?
-    int         jdwpTransport;
+    JdwpTransportType jdwpTransport;
     bool        jdwpServer;
     char*       jdwpHost;
     int         jdwpPort;
diff --git a/vm/Hash.c b/vm/Hash.cpp
similarity index 100%
rename from vm/Hash.c
rename to vm/Hash.cpp
diff --git a/vm/IndirectRefTable.c b/vm/IndirectRefTable.cpp
similarity index 100%
rename from vm/IndirectRefTable.c
rename to vm/IndirectRefTable.cpp
diff --git a/vm/Init.c b/vm/Init.cpp
similarity index 99%
rename from vm/Init.c
rename to vm/Init.cpp
index a8cf258..9019157 100644
--- a/vm/Init.c
+++ b/vm/Init.cpp
@@ -17,11 +17,7 @@
 /*
  * Dalvik initialization, shutdown, and command-line argument processing.
  */
-#include "Dalvik.h"
-#include "test/Test.h"
-#include "mterp/Mterp.h"
-#include "Hash.h"
-
+#define __STDC_LIMIT_MACROS
 #include <stdlib.h>
 #include <stdio.h>
 #include <signal.h>
@@ -30,6 +26,11 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#include "Dalvik.h"
+#include "test/Test.h"
+#include "mterp/Mterp.h"
+#include "Hash.h"
+
 #define kMinHeapStartSize   (1*1024*1024)
 #define kMinHeapSize        (2*1024*1024)
 #define kMaxHeapSize        (1*1024*1024*1024)
@@ -37,7 +38,7 @@
 /*
  * Register VM-agnostic native methods for system classes.
  */
-extern int jniRegisterSystemMethods(JNIEnv* env);
+extern "C" int jniRegisterSystemMethods(JNIEnv* env);
 
 /* fwd */
 static bool registerSystemNatives(JNIEnv* pEnv);
@@ -1332,7 +1333,7 @@
 
 #ifndef NDEBUG
     if (!dvmTestHash())
-        LOGE("dmvTestHash FAILED\n");
+        LOGE("dvmTestHash FAILED\n");
     if (false /*noisy!*/ && !dvmTestIndirectRefTable())
         LOGE("dvmTestIndirectRefTable FAILED\n");
 #endif
diff --git a/vm/InitRefs.c b/vm/InitRefs.cpp
similarity index 100%
rename from vm/InitRefs.c
rename to vm/InitRefs.cpp
diff --git a/vm/InlineNative.c b/vm/InlineNative.cpp
similarity index 97%
rename from vm/InlineNative.c
rename to vm/InlineNative.cpp
index f230c12..cd978aa 100644
--- a/vm/InlineNative.c
+++ b/vm/InlineNative.cpp
@@ -27,7 +27,7 @@
 //#warning "trying memcmp16"
 //#define CHECK_MEMCMP16
 /* "count" is in 16-bit units */
-extern u4 __memcmp16(const u2* s0, const u2* s1, size_t count);
+extern "C" u4 __memcmp16(const u2* s0, const u2* s1, size_t count);
 #endif
 
 /*
@@ -146,7 +146,7 @@
         chars = (ArrayObject*)
             dvmGetFieldObject((Object*) arg0, STRING_FIELDOFF_VALUE);
 
-        pResult->i = ((const u2*) chars->contents)[arg1 + offset];
+        pResult->i = ((const u2*)(void*)chars->contents)[arg1 + offset];
         return true;
     }
 }
@@ -238,8 +238,8 @@
         dvmGetFieldObject((Object*) arg0, STRING_FIELDOFF_VALUE);
     compArray = (ArrayObject*)
         dvmGetFieldObject((Object*) arg1, STRING_FIELDOFF_VALUE);
-    thisChars = ((const u2*) thisArray->contents) + thisOffset;
-    compChars = ((const u2*) compArray->contents) + compOffset;
+    thisChars = ((const u2*)(void*)thisArray->contents) + thisOffset;
+    compChars = ((const u2*)(void*)compArray->contents) + compOffset;
 
 #ifdef HAVE__MEMCMP16
     /*
@@ -359,8 +359,8 @@
         dvmGetFieldObject((Object*) arg0, STRING_FIELDOFF_VALUE);
     compArray = (ArrayObject*)
         dvmGetFieldObject((Object*) arg1, STRING_FIELDOFF_VALUE);
-    thisChars = ((const u2*) thisArray->contents) + thisOffset;
-    compChars = ((const u2*) compArray->contents) + compOffset;
+    thisChars = ((const u2*)(void*)thisArray->contents) + thisOffset;
+    compChars = ((const u2*)(void*)compArray->contents) + compOffset;
 
 #ifdef HAVE__MEMCMP16
     pResult->i = (__memcmp16(thisChars, compChars, thisCount) == 0);
@@ -452,7 +452,7 @@
     /* pull out the basic elements */
     ArrayObject* charArray =
         (ArrayObject*) dvmGetFieldObject(strObj, STRING_FIELDOFF_VALUE);
-    const u2* chars = (const u2*) charArray->contents;
+    const u2* chars = (const u2*)(void*)charArray->contents;
     int offset = dvmGetFieldInt(strObj, STRING_FIELDOFF_OFFSET);
     int count = dvmGetFieldInt(strObj, STRING_FIELDOFF_COUNT);
     //LOGI("String.indexOf(0x%08x, 0x%04x, %d) off=%d count=%d\n",
diff --git a/vm/Inlines.c b/vm/Inlines.cpp
similarity index 100%
rename from vm/Inlines.c
rename to vm/Inlines.cpp
diff --git a/vm/Intern.c b/vm/Intern.cpp
similarity index 100%
rename from vm/Intern.c
rename to vm/Intern.cpp
diff --git a/vm/JarFile.c b/vm/JarFile.cpp
similarity index 99%
rename from vm/JarFile.c
rename to vm/JarFile.cpp
index f26f1d6..0288fef 100644
--- a/vm/JarFile.c
+++ b/vm/JarFile.cpp
@@ -119,7 +119,7 @@
         LOGV("dvmDexCacheStatus: Checking cache for %s\n", fileName);
         cachedName = dexOptGenerateCacheFileName(fileName, kDexInJarName);
         if (cachedName == NULL)
-            return -1;
+            return DEX_CACHE_BAD_ARCHIVE;
 
         fd = dvmOpenCachedDexFile(fileName, cachedName,
                 dexGetZipEntryModTime(&archive, entry),
diff --git a/vm/LinearAlloc.c b/vm/LinearAlloc.cpp
similarity index 100%
rename from vm/LinearAlloc.c
rename to vm/LinearAlloc.cpp
diff --git a/vm/Misc.c b/vm/Misc.cpp
similarity index 100%
rename from vm/Misc.c
rename to vm/Misc.cpp
diff --git a/vm/Misc.h b/vm/Misc.h
index 8981824..c1ab72c 100644
--- a/vm/Misc.h
+++ b/vm/Misc.h
@@ -90,17 +90,19 @@
 #endif
 }
 
+typedef enum {
+    kDebugTargetUnknown = 0,
+    kDebugTargetLog,
+    kDebugTargetFile,
+} DebugTargetKind;
+
 /*
  * We pass one of these around when we want code to be able to write debug
  * info to either the log or to a file (or stdout/stderr).
  */
 typedef struct DebugOutputTarget {
     /* where to? */
-    enum {
-        kDebugTargetUnknown = 0,
-        kDebugTargetLog,
-        kDebugTargetFile,
-    } which;
+    DebugTargetKind which;
 
     /* additional bits */
     union {
diff --git a/vm/Native.c b/vm/Native.cpp
similarity index 97%
rename from vm/Native.c
rename to vm/Native.cpp
index a06bf3c..58963f5 100644
--- a/vm/Native.c
+++ b/vm/Native.cpp
@@ -71,7 +71,6 @@
     const Method* method, Thread* self)
 {
     ClassObject* clazz = method->clazz;
-    void* func;
 
     /*
      * If this is a static method, it could be called before the class
@@ -88,8 +87,8 @@
     }
 
     /* start with our internal-native methods */
-    func = dvmLookupInternalNativeMethod(method);
-    if (func != NULL) {
+    DalvikNativeFunc infunc = dvmLookupInternalNativeMethod(method);
+    if (infunc != NULL) {
         /* resolution always gets the same answer, so no race here */
         IF_LOGVV() {
             char* desc = dexProtoCopyMethodDescriptor(&method->prototype);
@@ -102,14 +101,14 @@
             LOGE("Failing on %s.%s\n", method->clazz->descriptor, method->name);
             dvmAbort();     // harsh, but this is VM-internal problem
         }
-        DalvikBridgeFunc dfunc = (DalvikBridgeFunc) func;
+        DalvikBridgeFunc dfunc = (DalvikBridgeFunc) infunc;
         dvmSetNativeFunc((Method*) method, dfunc, NULL);
         dfunc(args, pResult, method, self);
         return;
     }
 
     /* now scan any DLLs we have loaded for JNI signatures */
-    func = lookupSharedLibMethod(method);
+    void* func = lookupSharedLibMethod(method);
     if (func != NULL) {
         /* found it, point it at the JNI bridge and then call it */
         dvmUseJNIBridge((Method*) method, func);
@@ -580,27 +579,22 @@
  */
 static char* mangleString(const char* str, int len)
 {
-    u2* utf16 = NULL;
-    char* mangle = NULL;
-    int charLen;
-
     //LOGI("mangling '%s' %d\n", str, len);
 
     assert(str[len] == '\0');
 
-    charLen = dvmUtf8Len(str);
-    utf16 = (u2*) malloc(sizeof(u2) * charLen);
+    size_t charLen = dvmUtf8Len(str);
+    u2* utf16 = (u2*) malloc(sizeof(u2) * charLen);
     if (utf16 == NULL)
-        goto bail;
+        return NULL;
 
     dvmConvertUtf8ToUtf16(utf16, str);
 
     /*
      * Compute the length of the mangled string.
      */
-    int i, mangleLen = 0;
-
-    for (i = 0; i < charLen; i++) {
+    size_t mangleLen = 0;
+    for (size_t i = 0; i < charLen; i++) {
         u2 ch = utf16[i];
 
         if (ch == '$' || ch > 127) {
@@ -619,13 +613,14 @@
         }
     }
 
-    char* cp;
+    char* mangle = (char*) malloc(mangleLen +1);
+    if (mangle == NULL) {
+        free(utf16);
+        return NULL;
+    }
 
-    mangle = (char*) malloc(mangleLen +1);
-    if (mangle == NULL)
-        goto bail;
-
-    for (i = 0, cp = mangle; i < charLen; i++) {
+    char* cp = mangle;
+    for (size_t i = 0; i < charLen; i++) {
         u2 ch = utf16[i];
 
         if (ch == '$' || ch > 127) {
@@ -657,7 +652,6 @@
 
     *cp = '\0';
 
-bail:
     free(utf16);
     return mangle;
 }
diff --git a/vm/PointerSet.c b/vm/PointerSet.cpp
similarity index 100%
rename from vm/PointerSet.c
rename to vm/PointerSet.cpp
diff --git a/vm/Profile.c b/vm/Profile.cpp
similarity index 100%
rename from vm/Profile.c
rename to vm/Profile.cpp
diff --git a/vm/Properties.c b/vm/Properties.cpp
similarity index 100%
rename from vm/Properties.c
rename to vm/Properties.cpp
diff --git a/vm/RawDexFile.c b/vm/RawDexFile.cpp
similarity index 100%
rename from vm/RawDexFile.c
rename to vm/RawDexFile.cpp
diff --git a/vm/ReferenceTable.c b/vm/ReferenceTable.cpp
similarity index 100%
rename from vm/ReferenceTable.c
rename to vm/ReferenceTable.cpp
diff --git a/vm/SignalCatcher.c b/vm/SignalCatcher.cpp
similarity index 98%
rename from vm/SignalCatcher.c
rename to vm/SignalCatcher.cpp
index c8f9833..a8fc59d 100644
--- a/vm/SignalCatcher.c
+++ b/vm/SignalCatcher.cpp
@@ -178,7 +178,7 @@
          * We don't know how long it will take to do the disk I/O, so put us
          * into VMWAIT for the duration.
          */
-        int oldStatus = dvmChangeStatus(dvmThreadSelf(), THREAD_VMWAIT);
+        ThreadStatus oldStatus = dvmChangeStatus(dvmThreadSelf(), THREAD_VMWAIT);
 
         /*
          * Open the stack trace output file, creating it if necessary.  It
diff --git a/vm/StdioConverter.c b/vm/StdioConverter.cpp
similarity index 100%
rename from vm/StdioConverter.c
rename to vm/StdioConverter.cpp
diff --git a/vm/Sync.c b/vm/Sync.cpp
similarity index 99%
rename from vm/Sync.c
rename to vm/Sync.cpp
index 73f7d1c..fc6233b 100644
--- a/vm/Sync.c
+++ b/vm/Sync.cpp
@@ -84,7 +84,7 @@
      * Who last acquired this monitor, when lock sampling is enabled.
      * Even when enabled, ownerFileName may be NULL.
      */
-    char*       ownerFileName;
+    const char* ownerFileName;
     u4          ownerLineNumber;
 };
 
@@ -617,7 +617,7 @@
     bool wasInterrupted = false;
     bool timed;
     int ret;
-    char *savedFileName;
+    const char *savedFileName;
     u4 savedLineNumber;
 
     assert(self != NULL);
diff --git a/vm/Thread.c b/vm/Thread.cpp
similarity index 98%
rename from vm/Thread.c
rename to vm/Thread.cpp
index 62f95aa..1754e0d 100644
--- a/vm/Thread.c
+++ b/vm/Thread.cpp
@@ -384,8 +384,7 @@
         self->status = THREAD_VMWAIT;
     } else {
         /* happens during VM shutdown */
-        //LOGW("NULL self in dvmLockThreadList\n");
-        oldStatus = -1;         // shut up gcc
+        oldStatus = THREAD_UNDEFINED;  // shut up gcc
     }
 
     dvmLockMutex(&gDvm.threadListLock);
@@ -1232,16 +1231,10 @@
  */
 bool dvmCreateInterpThread(Object* threadObj, int reqStackSize)
 {
-    pthread_attr_t threadAttr;
-    pthread_t threadHandle;
-    Thread* self;
-    Thread* newThread = NULL;
-    Object* vmThreadObj = NULL;
-    int stackSize;
-
     assert(threadObj != NULL);
 
-    self = dvmThreadSelf();
+    Thread* self = dvmThreadSelf();
+    int stackSize;
     if (reqStackSize == 0)
         stackSize = gDvm.stackSize;
     else if (reqStackSize < kMinStackSize)
@@ -1251,6 +1244,7 @@
     else
         stackSize = reqStackSize;
 
+    pthread_attr_t threadAttr;
     pthread_attr_init(&threadAttr);
     pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
 
@@ -1258,13 +1252,16 @@
      * To minimize the time spent in the critical section, we allocate the
      * vmThread object here.
      */
-    vmThreadObj = dvmAllocObject(gDvm.classJavaLangVMThread, ALLOC_DEFAULT);
+    Object* vmThreadObj = dvmAllocObject(gDvm.classJavaLangVMThread, ALLOC_DEFAULT);
     if (vmThreadObj == NULL)
-        goto fail;
+        return false;
 
-    newThread = allocThread(stackSize);
-    if (newThread == NULL)
-        goto fail;
+    Thread* newThread = allocThread(stackSize);
+    if (newThread == NULL) {
+        dvmReleaseTrackedAlloc(vmThreadObj, NULL);
+        return false;
+    }
+
     newThread->threadObj = threadObj;
 
     assert(newThread->status == THREAD_INITIALIZING);
@@ -1282,7 +1279,8 @@
         dvmUnlockThreadList();
         dvmThrowIllegalThreadStateException(
             "thread has already been started");
-        goto fail;
+        freeThread(newThread);
+        dvmReleaseTrackedAlloc(vmThreadObj, NULL);
     }
 
     /*
@@ -1302,9 +1300,10 @@
     dvmUnlockThreadList();
 
     ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);
+    pthread_t threadHandle;
     int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart,
-            newThread);
-    oldStatus = dvmChangeStatus(self, oldStatus);
+                            newThread);
+    dvmChangeStatus(self, oldStatus);
 
     if (cc != 0) {
         /*
@@ -1721,7 +1720,7 @@
 
     jniArgs.version = JNI_VERSION_1_2;
     jniArgs.name = pArgs->name;
-    jniArgs.group = pArgs->group;
+    jniArgs.group = reinterpret_cast<jobject>(pArgs->group);
 
     setThreadName(pArgs->name);
 
@@ -2096,7 +2095,9 @@
      * parallel with us from here out.  It's important to do this if
      * profiling is enabled, since we can wait indefinitely.
      */
-    android_atomic_release_store(THREAD_VMWAIT, &self->status);
+    volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
+    volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
+    android_atomic_release_store(THREAD_VMWAIT, addr);
 
     /*
      * If we're doing method trace profiling, we don't want threads to exit,
@@ -2964,7 +2965,9 @@
          * the thread is supposed to be suspended.  This is possibly faster
          * on SMP and slightly more correct, but less convenient.
          */
-        android_atomic_acquire_store(newStatus, &self->status);
+        volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
+        volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
+        android_atomic_acquire_store(newStatus, addr);
         if (self->interpBreak.ctl.suspendCount != 0) {
             fullSuspendCheck(self);
         }
@@ -2977,7 +2980,9 @@
          * will be observed before the state change.
          */
         assert(newStatus != THREAD_SUSPENDED);
-        android_atomic_release_store(newStatus, &self->status);
+        volatile void* raw = reinterpret_cast<volatile void*>(&self->status);
+        volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw);
+        android_atomic_release_store(newStatus, addr);
     }
 
     return oldStatus;
diff --git a/vm/UtfString.c b/vm/UtfString.cpp
similarity index 93%
rename from vm/UtfString.c
rename to vm/UtfString.cpp
index ec35cdf..4b541b1 100644
--- a/vm/UtfString.c
+++ b/vm/UtfString.cpp
@@ -104,9 +104,10 @@
  * (If this needs optimizing, try: mask against 0xa0, shift right 5,
  * get increment {1-3} from table of 8 values.)
  */
-int dvmUtf8Len(const char* utf8Str)
+size_t dvmUtf8Len(const char* utf8Str)
 {
-    int ic, len = 0;
+    size_t len = 0;
+    int ic;
 
     while ((ic = *utf8Str++) != '\0') {
         len++;
@@ -193,7 +194,7 @@
 /*
  * Use the java/lang/String.computeHashCode() algorithm.
  */
-static inline u4 dvmComputeUtf16Hash(const u2* utf16Str, int len)
+static inline u4 computeUtf16Hash(const u2* utf16Str, size_t len)
 {
     u4 hash = 0;
 
@@ -202,6 +203,7 @@
 
     return hash;
 }
+
 u4 dvmComputeStringHash(const StringObject* strObj) {
     ArrayObject* chars = (ArrayObject*) dvmGetFieldObject((Object*) strObj,
                                 STRING_FIELDOFF_VALUE);
@@ -210,7 +212,7 @@
     len = dvmGetFieldInt((Object*) strObj, STRING_FIELDOFF_COUNT);
     offset = dvmGetFieldInt((Object*) strObj, STRING_FIELDOFF_OFFSET);
 
-    return dvmComputeUtf16Hash((u2*) chars->contents + offset, len);
+    return computeUtf16Hash((u2*)(void*)chars->contents + offset, len);
 }
 
 /*
@@ -235,7 +237,7 @@
  * Returns NULL and throws an exception on failure.
  */
 StringObject* dvmCreateStringFromCstrAndLength(const char* utf8Str,
-    u4 utf16Length)
+    size_t utf16Length)
 {
     assert(utf8Str != NULL);
 
@@ -245,9 +247,9 @@
         return NULL;
     }
 
-    dvmConvertUtf8ToUtf16((u2*) chars->contents, utf8Str);
+    dvmConvertUtf8ToUtf16((u2*)(void*)chars->contents, utf8Str);
 
-    u4 hashCode = dvmComputeUtf16Hash((u2*) chars->contents, utf16Length);
+    u4 hashCode = computeUtf16Hash((u2*)(void*)chars->contents, utf16Length);
     dvmSetFieldInt((Object*) newObj, STRING_FIELDOFF_HASHCODE, hashCode);
 
     return newObj;
@@ -269,7 +271,7 @@
 
     if (len > 0) memcpy(chars->contents, unichars, len * sizeof(u2));
 
-    u4 hashCode = dvmComputeUtf16Hash((u2*) chars->contents, len);
+    u4 hashCode = computeUtf16Hash((u2*)(void*)chars->contents, len);
     dvmSetFieldInt((Object*)newObj, STRING_FIELDOFF_HASHCODE, hashCode);
 
     return newObj;
@@ -296,7 +298,7 @@
     offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET);
     chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr,
                                 STRING_FIELDOFF_VALUE);
-    data = (const u2*) chars->contents + offset;
+    data = (const u2*)(void*)chars->contents + offset;
     assert(offset + len <= (int) chars->length);
 
     byteLen = utf16_utf8ByteLen(data, len);
@@ -341,7 +343,7 @@
     offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET);
     chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr,
                                 STRING_FIELDOFF_VALUE);
-    data = (const u2*) chars->contents + offset;
+    data = (const u2*)(void*)chars->contents + offset;
     assert(offset + len <= (int) chars->length);
 
     return utf16_utf8ByteLen(data, len);
@@ -375,7 +377,7 @@
     offset = dvmGetFieldInt((Object*) jstr, STRING_FIELDOFF_OFFSET);
     chars = (ArrayObject*) dvmGetFieldObject((Object*) jstr,
                                 STRING_FIELDOFF_VALUE);
-    return (const u2*) chars->contents + offset;
+    return (const u2*)(void*)chars->contents + offset;
 }
 
 
@@ -413,8 +415,8 @@
     assert(offset1 + len1 <= (int) chars1->length);
     assert(offset2 + len2 <= (int) chars2->length);
 
-    return memcmp((const u2*) chars1->contents + offset1,
-                  (const u2*) chars2->contents + offset2,
+    return memcmp((const u2*)(void*)chars1->contents + offset1,
+                  (const u2*)(void*)chars2->contents + offset2,
                   len1 * sizeof(u2));
 }
 
@@ -437,8 +439,7 @@
     /*
      * Create the individual String objects and add them to the array.
      */
-    size_t i;
-    for (i = 0; i < count; i++) {
+    for (size_t i = 0; i < count; i++) {
         Object* str =
             (Object*) dvmCreateStringFromCstr(strings[i]);
         if (str == NULL) {
diff --git a/vm/UtfString.h b/vm/UtfString.h
index a1ee712..6b9a5e3 100644
--- a/vm/UtfString.h
+++ b/vm/UtfString.h
@@ -93,7 +93,7 @@
  * Compute the number of characters in a "modified UTF-8" string.  This will
  * match the result from strlen() so long as there are no multi-byte chars.
  */
-int dvmUtf8Len(const char* utf8Str);
+size_t dvmUtf8Len(const char* utf8Str);
 
 /*
  * Convert a UTF-8 string to UTF-16.  "utf16Str" must have enough room
diff --git a/vm/jdwp/JdwpAdb.cpp b/vm/jdwp/JdwpAdb.cpp
index e73814d..3376910 100644
--- a/vm/jdwp/JdwpAdb.cpp
+++ b/vm/jdwp/JdwpAdb.cpp
@@ -163,7 +163,7 @@
     cmsg->cmsg_len   = msg.msg_controllen;
     cmsg->cmsg_level = SOL_SOCKET;
     cmsg->cmsg_type  = SCM_RIGHTS;
-    ((int*)CMSG_DATA(cmsg))[0] = -1;
+    ((int*)(void*)CMSG_DATA(cmsg))[0] = -1;
 
     do {
         ret = recvmsg(netState->controlSock, &msg, 0);
@@ -181,7 +181,7 @@
         return -1;
     }
 
-    return ((int*)CMSG_DATA(cmsg))[0];
+    return ((int*)(void*)CMSG_DATA(cmsg))[0];
 }
 
 /*
diff --git a/vm/mterp/Mterp.c b/vm/mterp/Mterp.cpp
similarity index 100%
rename from vm/mterp/Mterp.c
rename to vm/mterp/Mterp.cpp
diff --git a/vm/mterp/common/FindInterface.h b/vm/mterp/common/FindInterface.h
index 021ed65..a640adb 100644
--- a/vm/mterp/common/FindInterface.h
+++ b/vm/mterp/common/FindInterface.h
@@ -17,6 +17,10 @@
 /* common includes */
 #include "Dalvik.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Look up an interface on a class using the cache.
  *
@@ -35,3 +39,7 @@
 
 #undef ATOMIC_CACHE_CALC
 }
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/vm/test/AtomicTest.c b/vm/test/AtomicTest.cpp
similarity index 100%
rename from vm/test/AtomicTest.c
rename to vm/test/AtomicTest.cpp
diff --git a/vm/test/TestHash.c b/vm/test/TestHash.cpp
similarity index 93%
rename from vm/test/TestHash.c
rename to vm/test/TestHash.cpp
index 431e62a..b458028 100644
--- a/vm/test/TestHash.c
+++ b/vm/test/TestHash.cpp
@@ -141,7 +141,7 @@
     hash = 0;
 
     /* two entries, same hash, different values */
-    char* str1;
+    const char* str1;
     str1 = (char*) dvmHashTableLookup(pTab, hash, strdup("one"),
             (HashCompareFunc) strcmp, true);
     assert(str1 != NULL);
@@ -149,10 +149,10 @@
             (HashCompareFunc) strcmp, true);
 
     /* remove the first one */
-    if (!dvmHashTableRemove(pTab, hash, str1))
+    if (!dvmHashTableRemove(pTab, hash, (void*)str1))
         LOGE("TestHash failed to delete item\n");
     else
-        free(str1);     // "Remove" doesn't call the free func
+        free((void*)str1);     // "Remove" doesn't call the free func
 
     /* make sure iterator doesn't included deleted entries */
     int count = 0;
@@ -167,11 +167,11 @@
     }
 
     /* see if we can find them */
-    str = (const char*) dvmHashTableLookup(pTab, hash, "one",
+    str = (const char*) dvmHashTableLookup(pTab, hash, (void*)"one",
             (HashCompareFunc) strcmp,false);
     if (str != NULL)
         LOGE("TestHash deleted entry has returned!");
-    str = (const char*) dvmHashTableLookup(pTab, hash, "two",
+    str = (const char*) dvmHashTableLookup(pTab, hash, (void*)"two",
             (HashCompareFunc) strcmp,false);
     if (str == NULL)
         LOGE("TestHash entry vanished\n");
diff --git a/vm/test/TestIndirectRefTable.c b/vm/test/TestIndirectRefTable.cpp
similarity index 100%
rename from vm/test/TestIndirectRefTable.c
rename to vm/test/TestIndirectRefTable.cpp