Hi Will,<div><br></div><div>With this patch, it's hard to know what you added. Could you commit a first patch that just moves files around, and then add your new code in a new patch?</div><div><br></div><div>Thanks!</div>
<div>Nicolas<br><br><div class="gmail_quote">On Tue, Nov 15, 2011 at 9:12 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Inlined below, and attached.<br>
<br>
Besides implementing the rest of Unsafe, move the Classpath-only code<br>
from (what is currently) lib/J3/ClassLib/Classpath.inc into<br>
GNUClasspath.<br>
<br>
Thoughts welcome, and sorry for noisy diff.<br>
<br>
Thanks!<br>
<br>
~Will<br>
<br>
>From d5a34423a7f917454af7b759f468dec02925110d Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Tue, 8 Nov 2011 19:22:46 -0600<br>
Subject: [PATCH 1/2] Define all sun.misc.Unsafe methods, refactor into new<br>
 "Unsafe.inc"<br>
<br>
---<br>
 lib/J3/ClassLib/Classpath.inc                |  588 --------------------------<br>
 lib/J3/ClassLib/ClasspathField.inc           |   14 -<br>
 lib/J3/ClassLib/GNUClasspath/Classpath.inc   |  289 +++++++++++++<br>
 lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp |    3 +-<br>
 lib/J3/ClassLib/GNUClasspath/Makefile        |    8 +-<br>
 lib/J3/ClassLib/Makefile                     |    4 +-<br>
 lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp      |    2 +-<br>
 lib/J3/ClassLib/Unsafe.inc                   |  565 +++++++++++++++++++++++++<br>
 8 files changed, 864 insertions(+), 609 deletions(-)<br>
 delete mode 100644 lib/J3/ClassLib/Classpath.inc<br>
 create mode 100644 lib/J3/ClassLib/GNUClasspath/Classpath.inc<br>
 create mode 100644 lib/J3/ClassLib/Unsafe.inc<br>
<br>
diff --git a/lib/J3/ClassLib/Classpath.inc b/lib/J3/ClassLib/Classpath.inc<br>
deleted file mode 100644<br>
index 4fb16a4..0000000<br>
--- a/lib/J3/ClassLib/Classpath.inc<br>
+++ /dev/null<br>
@@ -1,588 +0,0 @@<br>
-//===-------- Classpath.cpp - Configuration for classpath<br>
-------------------===//<br>
-//<br>
-//                            The VMKit project<br>
-//<br>
-// This file is distributed under the University of Illinois Open Source<br>
-// License. See LICENSE.TXT for details.<br>
-//<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-<br>
-<br>
-#include "Classpath.h"<br>
-#include "ClasspathReflect.h"<br>
-#include "JavaClass.h"<br>
-#include "JavaThread.h"<br>
-#include "JavaUpcalls.h"<br>
-#include "Jnjvm.h"<br>
-#include "Reader.h"<br>
-#include "VMStaticInstance.h"<br>
-<br>
-<br>
-using namespace j3;<br>
-<br>
-extern "C" {<br>
-<br>
-// Convert a 'base' JavaObject to its pointer representation.<br>
-// Handles our special VMStaticInstance wrapper.<br>
-static inline uint8 *baseToPtr(JavaObject *base) {<br>
-  if (VMStaticInstance::isVMStaticInstance(base))<br>
-    return (uint8*)((VMStaticInstance*)base)->getStaticInstance();<br>
-  else<br>
-    return (uint8*)base;<br>
-}<br>
-<br>
-// Define hasClassInitializer because of a buggy implementation in Classpath.<br>
-JNIEXPORT bool JNICALL Java_java_io_VMObjectStreamClass_hasClassInitializer(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObject* Cl) {<br>
-<br>
-  llvm_gcroot(Cl, 0);<br>
-  bool res = false;<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(Cl);<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);<br>
-<br>
-  if (cl->isClass() &&<br>
-      cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,<br>
-                                           vm->bootstrapLoader->clinitType,<br>
-                                           true, false, 0))<br>
-  res = true;<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-<br>
-// Redefine some VMObjectStreamClass functions because of a slow implementation<br>
-// in Classpath.<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setBooleanNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jboolean val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceInt8Field(obj, (uint8)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jbyte val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceInt8Field(obj, (uint8)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jchar val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceInt16Field((JavaObject*)obj, (uint16)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jshort val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceInt16Field(obj, (sint16)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jint val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceInt32Field(obj, (sint32)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jlong val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceLongField(obj, (sint64)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jfloat val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceFloatField(obj, (float)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, jdouble val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceDoubleField(obj, (double)val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObjectField* Field, JavaObject* obj, JavaObject* val) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  llvm_gcroot(val, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  verifyNull(obj);<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  field->setInstanceObjectField(obj, val);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL Java_java_io_VMObjectInputStream_allocateObject(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-JavaObject* target, JavaObject* constr, JavaObjectConstructor* cons) {<br>
-<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(res, 0);<br>
-  llvm_gcroot(target, 0);<br>
-  llvm_gcroot(constr, 0);<br>
-  llvm_gcroot(cons, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserClass* cl =<br>
-    (UserClass*)UserCommonClass::resolvedImplClass(vm, target, true);<br>
-  res = cl->doNew(vm);<br>
-  JavaMethod* meth = JavaObjectConstructor::getInternalMethod(cons);<br>
-  meth->invokeIntSpecial(vm, cl, res);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL Java_java_lang_reflect_VMArray_createObjectArray(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv * env,<br>
-jclass thisClass,<br>
-#endif<br>
-JavaObject* arrayType, jint arrayLength) {<br>
-<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(arrayType, 0);<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* base =<br>
-    UserCommonClass::resolvedImplClass(vm, arrayType, true);<br>
-  JnjvmClassLoader* loader = base->classLoader;<br>
-  const UTF8* name = base->getName();<br>
-  // -1 because we're adding a new dimension in this method.<br>
-  const int kLimit = 255 - 1;<br>
-  const uint16* elements = name->elements;<br>
-  if (name->size > kLimit && elements[kLimit] == '[') {<br>
-    vm->illegalArgumentException("Too many dimensions for array");<br>
-  }<br>
-  const UTF8* arrayName = loader->constructArrayName(1, name);<br>
-  UserClassArray* array = loader->constructArray(arrayName, base);<br>
-  res = array->doNew(arrayLength, vm);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-<br>
-// Never throws.<br>
-JNIEXPORT<br>
-bool JNICALL Java_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-jclass clazz,<br>
-#endif<br>
-) {<br>
-  return false;<br>
-}<br>
-<br>
-// Never throws.<br>
-JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* unsafe, JavaObject* obj, jlong offset, jlong expect,<br>
jlong update) {<br>
-<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  jlong *ptr;<br>
-  jlong  value;<br>
-<br>
-  ptr = (jlong *) (((uint8 *) obj) + offset);<br>
-<br>
-  value = *ptr;<br>
-<br>
-  if (value == expect) {<br>
-    *ptr = update;<br>
-    return true;<br>
-  } else {<br>
-    return false;<br>
-  }<br>
-<br>
-}<br>
-<br>
-// Never throws.<br>
-JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* unsafe, JavaObject* obj, jlong offset, jint expect, jint update) {<br>
-<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  jint *ptr;<br>
-<br>
-  ptr = (jint *) (((uint8 *) obj) + offset);<br>
-<br>
-  return __sync_bool_compare_and_swap(ptr, expect, update);<br>
-}<br>
-<br>
-// Never throws.<br>
-JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* expect,<br>
-JavaObject* update) {<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  llvm_gcroot(expect, 0);<br>
-  llvm_gcroot(update, 0);<br>
-<br>
-  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);<br>
-<br>
-  return mvm::Collector::objectReferenceTryCASBarrier((gc*)obj,<br>
(gc**)ptr, (gc*)expect, (gc*)update);<br>
-}<br>
-<br>
-// Never throws.<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* value) {<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-  llvm_gcroot(value, 0);<br>
-<br>
-  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);<br>
-  mvm::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr, (gc*)value);<br>
-}<br>
-<br>
-JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(<br>
-JavaObject* unsafe, jlong size) {<br>
-  // TODO: Invalid size/OOM/etc handling!<br>
-  jlong res = 0;<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-  res = (jlong)malloc(size);<br>
-  END_NATIVE_EXCEPTION<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(<br>
-JavaObject* unsafe, jlong ptr) {<br>
-  // TODO: Exception handling...<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-  free((void*)ptr);<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(<br>
-JavaObject* unsafe, jlong ptr, jlong value) {<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-  *(jlong*)ptr = value;<br>
-  END_NATIVE_EXCEPTION<br>
-}<br>
-<br>
-JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(<br>
-JavaObject* unsafe, jlong ptr) {<br>
-  jbyte res = 0;<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-  res =  *(jbyte*)ptr;<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(<br>
-JavaObject* unsafe, JavaObject* clazz) {<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(clazz, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-<br>
-  CommonClass * cl = JavaObject::getClass(clazz);<br>
-  assert(cl && cl->isClass());<br>
-  cl->asClass()->resolveClass();<br>
-  cl->asClass()->initialiseClass(vm);<br>
-<br>
-  END_NATIVE_EXCEPTION;<br>
-}<br>
-<br>
-JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(<br>
-JavaObject* unsafe, JavaObjectField* _field) {<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(_field, 0);<br>
-<br>
-  jlong res = 0;<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaField * field = JavaObjectField::getInternalField(_field);<br>
-  assert(field);<br>
-<br>
-  res = field->ptrOffset;<br>
-<br>
-  END_NATIVE_EXCEPTION;<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_staticFieldBase(<br>
-JavaObject* unsafe, JavaObjectField* _field) {<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(_field, 0);<br>
-  llvm_gcroot(res, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaField * field = JavaObjectField::getInternalField(_field);<br>
-  assert(field);<br>
-  field->classDef->initialiseClass(JavaThread::get()->getJVM());<br>
-<br>
-  res = VMStaticInstance::allocate(field->classDef);<br>
-<br>
-  END_NATIVE_EXCEPTION;<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(<br>
-JavaObject* unsafe, JavaObject* base, jlong offset) {<br>
-  JavaObject * res = 0;<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(base, 0);<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-  JavaObject** ptr = (JavaObject**) (baseToPtr(base) + offset);<br>
-  res = *ptr;<br>
-  END_NATIVE_EXCEPTION;<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(<br>
-JavaObject* unsafe, JavaObject* clazz) {<br>
-  // Array starts at beginning of object<br>
-  return 0;<br>
-}<br>
-<br>
-JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* unsafe, JavaObject* clazz) {<br>
-  // Return '0' if we don't support indexing this way.<br>
-  // (We might pack fields specially, etc)<br>
-  // TODO: Implement this for the array types we support this way<br>
-  return 0;<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(<br>
-JavaObject* unsafe, JavaString *name, ArrayObject * bytesArr, jint<br>
off, jint len, JavaObject * loader, JavaObject * pd) {<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(res, 0);<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(name, 0);<br>
-  llvm_gcroot(bytesArr, 0);<br>
-  llvm_gcroot(loader, 0);<br>
-  llvm_gcroot(pd, 0);<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  JnjvmClassLoader* JCL = NULL;<br>
-  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);<br>
-<br>
-  jint last = off + len;<br>
-  if (last < bytesArr->size) {<br>
-    assert(0 && "What exception to throw here?");<br>
-  }<br>
-  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);<br>
-  memcpy(bytes->elements, JavaArray::getElements(bytesArr)+off, len);<br>
-  const UTF8* utfName = JavaString::javaToInternal(name, JCL->hashUTF8);<br>
-  UserClass *cl = JCL->constructClass(utfName, bytes);<br>
-<br>
-  if (cl) res = (JavaObject*)cl->getClassDelegatee(vm);<br>
-<br>
-  END_NATIVE_EXCEPTION;<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_allocateInstance__Ljava_lang_Class_2(<br>
-JavaObject* unsafe, JavaObjectClass * clazz) {<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(clazz, 0);<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaThread* th = JavaThread::get();<br>
-  Jnjvm* vm = th->getJVM();<br>
-<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);<br>
-  if (cl->isClass())<br>
-    res = cl->asClass()->doNew(vm);<br>
-<br>
-  END_NATIVE_EXCEPTION;<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(<br>
-JavaObject* unsafe, JavaObject * obj) {<br>
-  llvm_gcroot(unsafe, 0);<br>
-  llvm_gcroot(obj, 0);<br>
-<br>
-  JavaThread::get()->throwException(obj);<br>
-}<br>
-<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JavaObject*) {<br>
-  // Nothing<br>
-}<br>
-<br>
-// TODO: Add the Volatile variants<br>
-#define GET_PUT_OFFSET(Type,jtype,shorttype) \<br>
-JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ##<br>
__Ljava_lang_Object_2J( \<br>
-JavaObject* unsafe, JavaObject* base, jlong offset) { \<br>
-  jtype res = 0; \<br>
-  BEGIN_NATIVE_EXCEPTION(0) \<br>
-  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \<br>
-  res = *ptr; \<br>
-  END_NATIVE_EXCEPTION \<br>
- \<br>
-  return res; \<br>
-} \<br>
- \<br>
-JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##<br>
__Ljava_lang_Object_2J ## shorttype( \<br>
-JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \<br>
-  BEGIN_NATIVE_EXCEPTION(0) \<br>
-  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \<br>
-  *ptr = val; \<br>
-  END_NATIVE_EXCEPTION \<br>
-}<br>
-<br>
-GET_PUT_OFFSET(Boolean,jboolean,Z)<br>
-GET_PUT_OFFSET(Byte,jbyte,B)<br>
-GET_PUT_OFFSET(Char,jchar,C)<br>
-GET_PUT_OFFSET(Short,jshort,S)<br>
-GET_PUT_OFFSET(Int,jint,I)<br>
-GET_PUT_OFFSET(Long,jlong,J)<br>
-GET_PUT_OFFSET(Float,jfloat,F)<br>
-GET_PUT_OFFSET(Double,jdouble,D)<br>
-<br>
-}<br>
diff --git a/lib/J3/ClassLib/ClasspathField.inc<br>
b/lib/J3/ClassLib/ClasspathField.inc<br>
index e56c82f..010c54b 100644<br>
--- a/lib/J3/ClassLib/ClasspathField.inc<br>
+++ b/lib/J3/ClassLib/ClasspathField.inc<br>
@@ -1154,18 +1154,4 @@ JavaObjectField* Field, JavaObject* obj, jdouble val) {<br>
  END_NATIVE_EXCEPTION<br>
 }<br>
<br>
-// Never throws.<br>
-JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(<br>
-#ifdef NATIVE_JNI<br>
-JNIEnv *env,<br>
-#endif<br>
-JavaObject* Unsafe, JavaObjectField* Field) {<br>
-<br>
-  llvm_gcroot(Field, 0);<br>
-  llvm_gcroot(Unsafe, 0);<br>
-<br>
-  JavaField* field = JavaObjectField::getInternalField(Field);<br>
-  return (jlong)field->ptrOffset;<br>
-}<br>
-<br>
 }<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/Classpath.inc<br>
b/lib/J3/ClassLib/GNUClasspath/Classpath.inc<br>
new file mode 100644<br>
index 0000000..3354774<br>
--- /dev/null<br>
+++ b/lib/J3/ClassLib/GNUClasspath/Classpath.inc<br>
@@ -0,0 +1,289 @@<br>
+//===-------- Classpath.cpp - Configuration for classpath<br>
-------------------===//<br>
+//<br>
+//                            The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+<br>
+<br>
+#include "Classpath.h"<br>
+#include "ClasspathReflect.h"<br>
+#include "JavaClass.h"<br>
+#include "JavaThread.h"<br>
+#include "JavaUpcalls.h"<br>
+#include "Jnjvm.h"<br>
+#include "Reader.h"<br>
+<br>
+using namespace j3;<br>
+<br>
+extern "C" {<br>
+<br>
+// Define hasClassInitializer because of a buggy implementation in Classpath.<br>
+JNIEXPORT bool JNICALL Java_java_io_VMObjectStreamClass_hasClassInitializer(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObject* Cl) {<br>
+<br>
+  llvm_gcroot(Cl, 0);<br>
+  bool res = false;<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(Cl);<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);<br>
+<br>
+  if (cl->isClass() &&<br>
+      cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,<br>
+                                           vm->bootstrapLoader->clinitType,<br>
+                                           true, false, 0))<br>
+  res = true;<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+<br>
+// Redefine some VMObjectStreamClass functions because of a slow implementation<br>
+// in Classpath.<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setBooleanNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jboolean val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceInt8Field(obj, (uint8)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jbyte val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceInt8Field(obj, (uint8)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jchar val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceInt16Field((JavaObject*)obj, (uint16)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jshort val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceInt16Field(obj, (sint16)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jint val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceInt32Field(obj, (sint32)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jlong val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceLongField(obj, (sint64)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jfloat val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceFloatField(obj, (float)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, jdouble val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceDoubleField(obj, (double)val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObjectField* Field, JavaObject* obj, JavaObject* val) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+  llvm_gcroot(val, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  verifyNull(obj);<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  field->setInstanceObjectField(obj, val);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL Java_java_io_VMObjectInputStream_allocateObject(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+JavaObject* target, JavaObject* constr, JavaObjectConstructor* cons) {<br>
+<br>
+  JavaObject* res = 0;<br>
+  llvm_gcroot(res, 0);<br>
+  llvm_gcroot(target, 0);<br>
+  llvm_gcroot(constr, 0);<br>
+  llvm_gcroot(cons, 0);<br>
+<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* cl =<br>
+    (UserClass*)UserCommonClass::resolvedImplClass(vm, target, true);<br>
+  res = cl->doNew(vm);<br>
+  JavaMethod* meth = JavaObjectConstructor::getInternalMethod(cons);<br>
+  meth->invokeIntSpecial(vm, cl, res);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL Java_java_lang_reflect_VMArray_createObjectArray(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv * env,<br>
+jclass thisClass,<br>
+#endif<br>
+JavaObject* arrayType, jint arrayLength) {<br>
+<br>
+  JavaObject* res = 0;<br>
+  llvm_gcroot(arrayType, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserCommonClass* base =<br>
+    UserCommonClass::resolvedImplClass(vm, arrayType, true);<br>
+  JnjvmClassLoader* loader = base->classLoader;<br>
+  const UTF8* name = base->getName();<br>
+  // -1 because we're adding a new dimension in this method.<br>
+  const int kLimit = 255 - 1;<br>
+  const uint16* elements = name->elements;<br>
+  if (name->size > kLimit && elements[kLimit] == '[') {<br>
+    vm->illegalArgumentException("Too many dimensions for array");<br>
+  }<br>
+  const UTF8* arrayName = loader->constructArrayName(1, name);<br>
+  UserClassArray* array = loader->constructArray(arrayName, base);<br>
+  res = array->doNew(arrayLength, vm);<br>
+<br>
+  END_NATIVE_EXCEPTION<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+// Never throws.<br>
+JNIEXPORT<br>
+bool JNICALL Java_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+jclass clazz,<br>
+#endif<br>
+) {<br>
+  return false;<br>
+}<br>
+<br>
+}<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp<br>
b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp<br>
index bc797d1..57197c4 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp<br>
+++ b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp<br>
@@ -1071,8 +1071,8 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {<br>
<br>
 }<br>
<br>
-#include "ClasspathConstructor.inc"<br>
 #include "Classpath.inc"<br>
+#include "ClasspathConstructor.inc"<br>
 #include "ClasspathField.inc"<br>
 #include "ClasspathMethod.inc"<br>
 #include "ClasspathVMClass.inc"<br>
@@ -1084,3 +1084,4 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {<br>
 #include "ClasspathVMSystemProperties.inc"<br>
 #include "ClasspathVMThread.inc"<br>
 #include "ClasspathVMThrowable.inc"<br>
+#include "Unsafe.inc"<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/Makefile<br>
b/lib/J3/ClassLib/GNUClasspath/Makefile<br>
index be80b9e..f5939c9 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/Makefile<br>
+++ b/lib/J3/ClassLib/GNUClasspath/Makefile<br>
@@ -9,9 +9,11 @@<br>
 LEVEL = ../../../..<br>
<br>
<br>
-EXTRA_DIST = ClasspathVMClass.inc ClasspathVMClassLoader.inc<br>
ClasspathVMObject.inc \<br>
-            ClasspathVMRuntime.inc ClasspathVMStackWalker.inc<br>
ClasspathVMSystem.inc \<br>
-            ClasspathVMSystemProperties.inc ClasspathVMThread.inc<br>
ClasspathVMThrowable.inc<br>
+EXTRA_DIST = Classpath.inc ClasspathVMClass.inc ClasspathVMClassLoader.inc \<br>
+             ClasspathVMObject.inc ClasspathVMRuntime.inc \<br>
+             ClasspathVMStackWalker.inc ClasspathVMSystem.inc \<br>
+             ClasspathVMSystemProperties.inc ClasspathVMThread.inc \<br>
+             ClasspathVMThrowable.inc<br>
<br>
 include $(LEVEL)/Makefile.config<br>
<br>
diff --git a/lib/J3/ClassLib/Makefile b/lib/J3/ClassLib/Makefile<br>
index 8252b92..8fd7e2a 100644<br>
--- a/lib/J3/ClassLib/Makefile<br>
+++ b/lib/J3/ClassLib/Makefile<br>
@@ -12,9 +12,9 @@ EXTRA_DIST = ArrayCopy.inc \<br>
             ClassContext.inc \<br>
             ClasspathConstructor.inc \<br>
             ClasspathField.inc \<br>
-             Classpath.inc \<br>
             ClasspathMethod.inc \<br>
-             SetProperties.inc<br>
+             SetProperties.inc \<br>
+             Unsafe.inc<br>
<br>
 include $(LEVEL)/Makefile.config<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
index 22db276..3fa6390 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
@@ -897,7 +897,7 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {<br>
<br>
<br>
 #include "ClasspathConstructor.inc"<br>
-#include "Classpath.inc"<br>
 #include "ClasspathField.inc"<br>
 #include "ClasspathMethod.inc"<br>
 #include "OpenJDK.inc"<br>
+#include "Unsafe.inc"<br>
diff --git a/lib/J3/ClassLib/Unsafe.inc b/lib/J3/ClassLib/Unsafe.inc<br>
new file mode 100644<br>
index 0000000..44ffe73<br>
--- /dev/null<br>
+++ b/lib/J3/ClassLib/Unsafe.inc<br>
@@ -0,0 +1,565 @@<br>
+//===-------- Unsafe.inc - sun.misc.Unsafe implementation<br>
-----------------===//<br>
+//<br>
+//                            The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "VMStaticInstance.h"<br>
+#include <stdlib.h><br>
+<br>
+/// fieldPtr - Compute the address of the field specified by the given<br>
+/// base/offset pair.  Non-trivial due to our handling of static instances,<br>
+/// and this also handles null-checking as required.<br>
+///<br>
+static inline uint8 *fieldPtr(JavaObject *base, long long offset,<br>
+  bool throwOnNull = true) {<br>
+<br>
+  // For most uses, a 'null' base should throw an exception.<br>
+  if (throwOnNull) verifyNull(base);<br>
+<br>
+  if (base && VMStaticInstance::isVMStaticInstance(base))<br>
+    return (uint8*)((VMStaticInstance*)base)->getStaticInstance() + offset;<br>
+  else<br>
+    return (uint8*)base + offset;<br>
+}<br>
+<br>
+extern "C" {<br>
+<br>
+//===--- Base/Offset methods<br>
----------------------------------------------===//<br>
+<br>
+/// staticFieldOffset - Return the offset of a particular static field<br>
+/// Only valid to be used with the corresponding staticFieldBase<br>
+///<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(<br>
+JavaObject* unsafe, JavaObjectField* _field) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(_field, 0);<br>
+<br>
+  jlong res = 0;<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  JavaField * field = JavaObjectField::getInternalField(_field);<br>
+  assert(field);<br>
+<br>
+  res = field->ptrOffset;<br>
+<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+/// staticFieldBase - Return a JavaObject* representing the static instance.<br>
+/// Note that our static instances aren't actually java objects, so we use<br>
+/// a placeholder object "VMStaticInstance" that also ensures that<br>
+/// the corresponding class doesn't get GC'd underneath it.<br>
+///<br>
+JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_staticFieldBase(<br>
+JavaObject* unsafe, JavaObjectField* _field) {<br>
+  JavaObject* res = 0;<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(_field, 0);<br>
+  llvm_gcroot(res, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  JavaField * field = JavaObjectField::getInternalField(_field);<br>
+  assert(field);<br>
+  field->classDef->initialiseClass(JavaThread::get()->getJVM());<br>
+<br>
+  res = VMStaticInstance::allocate(field->classDef);<br>
+<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+/// arrayBaseOffset - Offset from the array object where the actual<br>
+/// element data begins.<br>
+///<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(<br>
+JavaObject* unsafe, JavaObject* clazz) {<br>
+  // Array starts at beginning of object<br>
+  return 0;<br>
+}<br>
+<br>
+/// arrayIndexScale - Indexing scale for the element type in<br>
+/// the specified array.  For use with arrayBaseOffset,<br>
+/// NthElementPtr = ArrayObject + BaseOffset + N*IndexScale<br>
+/// Return '0' if our JVM stores the elements in a way that<br>
+/// makes this type of access impossible or unsupported.<br>
+///<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* clazz) {<br>
+  // For now, just return '0', indicating we don't support this indexing.<br>
+  // TODO: Implement this for the array types we /do/ support this way.<br>
+  return 0;<br>
+}<br>
+<br>
+<br>
+<br>
+/// objectFieldOffset - Pointer offset of the specified field<br>
+///<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* Unsafe, JavaObjectField* Field) {<br>
+<br>
+  llvm_gcroot(Field, 0);<br>
+  llvm_gcroot(Unsafe, 0);<br>
+<br>
+  JavaField* field = JavaObjectField::getInternalField(Field);<br>
+  return (jlong)field->ptrOffset;<br>
+}<br>
+<br>
+//===--- Double-register addressing field accessors<br>
-----------------------===//<br>
+// See objectFieldOffset, staticFieldOffset, staticFieldBase<br>
+// Can also be an array, if/when we support arrayIndexScale/arrayBaseOffset<br>
+#define GET_PUT_OFFSET(Type,jtype,shorttype) \<br>
+JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ##<br>
__Ljava_lang_Object_2J( \<br>
+JavaObject* unsafe, JavaObject* base, jlong offset) { \<br>
+  jtype res = 0; \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  jtype* ptr = (jtype*)fieldPtr(base,offset); \<br>
+  res = *ptr; \<br>
+  END_NATIVE_EXCEPTION \<br>
+  return res; \<br>
+} \<br>
+ \<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##<br>
__Ljava_lang_Object_2J ## shorttype( \<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  jtype* ptr = (jtype*)fieldPtr(base, offset); \<br>
+  *ptr = val; \<br>
+  END_NATIVE_EXCEPTION \<br>
+}<br>
+<br>
+//===--- Direct address read/write acccessors<br>
-----------------------------===//<br>
+#define GET_PUT_DIRECT(Type,jtype,shorttype) \<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ## __J ## shorttype( \<br>
+JavaObject* unsafe, jlong ptr, jtype val) { \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  *(jtype*)ptr = val; \<br>
+  END_NATIVE_EXCEPTION \<br>
+} \<br>
+ \<br>
+JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ## __J( \<br>
+JavaObject* unsafe, jlong ptr) { \<br>
+  jtype res = 0; \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  res = *(jtype*)ptr; \<br>
+  END_NATIVE_EXCEPTION \<br>
+  return res; \<br>
+}<br>
+<br>
+//===--- Volatile variant of field accessors<br>
------------------------------===//<br>
+// Memory barriers after writes to ensure new value is seen elsewhere<br>
+#define GET_PUT_OFFSET_VOLATILE(Type,jtype,shorttype) \<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##<br>
Volatile__J ## shorttype( \<br>
+JavaObject* unsafe, jlong ptr, jtype val) { \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  *(volatile jtype*)ptr = val; \<br>
+  __sync_synchronize(); \<br>
+  END_NATIVE_EXCEPTION \<br>
+} \<br>
+ \<br>
+JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ## Volatile__J( \<br>
+JavaObject* unsafe, jlong ptr) { \<br>
+  jtype res = 0; \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  res = *(volatile jtype*)ptr; \<br>
+  END_NATIVE_EXCEPTION \<br>
+  return res; \<br>
+}<br>
+<br>
+//===--- Volatile variant of direct address accessors<br>
---------------------===//<br>
+#define GET_PUT_DIRECT_VOLATILE(Type,jtype,shorttype) \<br>
+JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ##<br>
Volatile__Ljava_lang_Object_2J( \<br>
+JavaObject* unsafe, JavaObject* base, jlong offset) { \<br>
+  jtype res = 0; \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  volatile jtype* ptr = (volatile jtype*)fieldPtr(base,offset); \<br>
+  res = *ptr; \<br>
+  END_NATIVE_EXCEPTION \<br>
+ \<br>
+  return res; \<br>
+} \<br>
+ \<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##<br>
Volatile__Ljava_lang_Object_2J ## shorttype( \<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  volatile jtype* ptr = (volatile jtype*)fieldPtr(base,offset); \<br>
+  *ptr = val; \<br>
+  __sync_synchronize(); \<br>
+  END_NATIVE_EXCEPTION \<br>
+}<br>
+<br>
+//===--- Ordered variant of field accessors<br>
-------------------------------===//<br>
+#define GET_PUT_FIELD_ORDERED(Type,jtype,shorttype) \<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrdered ## Type( \<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \<br>
+  BEGIN_NATIVE_EXCEPTION(0) \<br>
+  volatile jtype* ptr = (volatile jtype*)fieldPtr(base,offset); \<br>
+  *ptr = val; \<br>
+  /* No memory barrier */ \<br>
+  END_NATIVE_EXCEPTION \<br>
+}<br>
+<br>
+#define GET_PUT_ALL(Type,jtype,shorttype) \<br>
+  GET_PUT_OFFSET(Type,jtype,shorttype) \<br>
+  GET_PUT_DIRECT(Type,jtype,shorttype) \<br>
+  GET_PUT_OFFSET_VOLATILE(Type,jtype,shorttype) \<br>
+  GET_PUT_DIRECT_VOLATILE(Type,jtype,shorttype)<br>
+<br>
+GET_PUT_ALL(Boolean,jboolean,Z)<br>
+GET_PUT_ALL(Byte,jbyte,B)<br>
+GET_PUT_ALL(Char,jchar,C)<br>
+GET_PUT_ALL(Short,jshort,S)<br>
+GET_PUT_ALL(Int,jint,I)<br>
+GET_PUT_ALL(Long,jlong,J) // TODO: Long needs special handling!<br>
+GET_PUT_ALL(Float,jfloat,F)<br>
+GET_PUT_ALL(Double,jdouble,D)<br>
+<br>
+// Ordered:<br>
+GET_PUT_FIELD_ORDERED(Int,jint,I)<br>
+GET_PUT_FIELD_ORDERED(Long,jlong,J)<br>
+<br>
+//===--- Get/Put of Objects, due to GC needs special handling<br>
-------------===//<br>
+// JavaObject field accessors:<br>
+JNIEXPORT void JNICALL<br>
Java_sun_misc_Unsafe_putObject__Ljava_lang_Object_2JLjava_lang_Object_2(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, JavaObject* value) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(value, 0);<br>
+<br>
+  JavaObject** ptr = (JavaObject**)fieldPtr(base, offset);<br>
+  mvm::Collector::objectReferenceWriteBarrier((gc*)base, (gc**)ptr,<br>
(gc*)value);<br>
+}<br>
+<br>
+<br>
+JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_getObject__Ljava_lang_Object_2J(<br>
+JavaObject* unsafe, JavaObject* base, jlong offset) {<br>
+  JavaObject * res = 0;<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  JavaObject** ptr = (JavaObject**)fieldPtr(base, offset);<br>
+  res = *ptr;<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+// Volatile JavaObject field accessors:<br>
+// Never throws.<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, JavaObject* value) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(value, 0);<br>
+<br>
+  JavaObject** ptr = (JavaObject**)fieldPtr(base, offset);<br>
+  mvm::Collector::objectReferenceWriteBarrier((gc*)base, (gc**)ptr,<br>
(gc*)value);<br>
+  // Ensure this value is seen.<br>
+  __sync_synchronize();<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(<br>
+JavaObject* unsafe, JavaObject* base, jlong offset) {<br>
+  JavaObject * res = 0;<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  JavaObject* volatile* ptr = (JavaObject* volatile*)fieldPtr(base, offset);<br>
+  res = *ptr;<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, JavaObject* value) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(value, 0);<br>
+<br>
+  JavaObject** ptr = (JavaObject**)fieldPtr(base, offset);<br>
+  mvm::Collector::objectReferenceWriteBarrier((gc*)base, (gc**)ptr,<br>
(gc*)value);<br>
+  // No barrier (difference between volatile and ordered)<br>
+}<br>
+<br>
+<br>
+//===--- CompareAndSwap field accessors<br>
-----------------------------------===//<br>
+// Never throws.<br>
+JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, jlong expect,<br>
jlong update) {<br>
+<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  jlong *ptr;<br>
+  jlong  value;<br>
+<br>
+  // TODO: Why isn't this atomic?<br>
+  ptr = (jlong*)fieldPtr(base, offset);<br>
+<br>
+  value = *ptr;<br>
+<br>
+  if (value == expect) {<br>
+    *ptr = update;<br>
+    return true;<br>
+  } else {<br>
+    return false;<br>
+  }<br>
+<br>
+}<br>
+<br>
+// Never throws.<br>
+JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, jint expect, jint update) {<br>
+<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  jint *ptr;<br>
+<br>
+  ptr = (jint *)fieldPtr(base, offset);<br>
+<br>
+  return __sync_bool_compare_and_swap(ptr, expect, update);<br>
+}<br>
+<br>
+// Never throws.<br>
+JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(<br>
+#ifdef NATIVE_JNI<br>
+JNIEnv *env,<br>
+#endif<br>
+JavaObject* unsafe, JavaObject* base, jlong offset, JavaObject* expect,<br>
+JavaObject* update) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(base, 0);<br>
+  llvm_gcroot(expect, 0);<br>
+  llvm_gcroot(update, 0);<br>
+<br>
+  JavaObject** ptr = (JavaObject**)fieldPtr(base, offset);<br>
+  return mvm::Collector::objectReferenceTryCASBarrier((gc*)base,<br>
(gc**)ptr, (gc*)expect, (gc*)update);<br>
+}<br>
+<br>
+<br>
+//===--- Class-related functions<br>
------------------------------------------===//<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(<br>
+JavaObject* unsafe, JavaObject* clazz) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(clazz, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+<br>
+  CommonClass * cl = JavaObject::getClass(clazz);<br>
+  assert(cl && cl->isClass());<br>
+  cl->asClass()->resolveClass();<br>
+  cl->asClass()->initialiseClass(vm);<br>
+<br>
+  END_NATIVE_EXCEPTION;<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BII(<br>
+JavaObject* unsafe, JavaString *name, ArrayObject * bytesArr, jint<br>
off, jint len) {<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(<br>
+JavaObject* unsafe, JavaString *name, ArrayObject * bytesArr, jint<br>
off, jint len, JavaObject * loader, JavaObject * pd) {<br>
+  JavaObject* res = 0;<br>
+  llvm_gcroot(res, 0);<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(name, 0);<br>
+  llvm_gcroot(bytesArr, 0);<br>
+  llvm_gcroot(loader, 0);<br>
+  llvm_gcroot(pd, 0);<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  JnjvmClassLoader* JCL = NULL;<br>
+  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);<br>
+<br>
+  jint last = off + len;<br>
+  if (last < bytesArr->size) {<br>
+    assert(0 && "What exception to throw here?");<br>
+  }<br>
+  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);<br>
+  memcpy(bytes->elements, JavaArray::getElements(bytesArr)+off, len);<br>
+  const UTF8* utfName = JavaString::javaToInternal(name, JCL->hashUTF8);<br>
+  UserClass *cl = JCL->constructClass(utfName, bytes);<br>
+<br>
+  if (cl) res = (JavaObject*)cl->getClassDelegatee(vm);<br>
+<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL<br>
Java_sun_misc_Unsafe_allocateInstance__Ljava_lang_Class_2(<br>
+JavaObject* unsafe, JavaObjectClass * clazz) {<br>
+  JavaObject* res = 0;<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(clazz, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+<br>
+  JavaThread* th = JavaThread::get();<br>
+  Jnjvm* vm = th->getJVM();<br>
+<br>
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);<br>
+  if (cl->isClass())<br>
+    res = cl->asClass()->doNew(vm);<br>
+<br>
+  END_NATIVE_EXCEPTION;<br>
+<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT JavaObject* JNICALL Java_sun_Unsafe_defineAnonymousClass(<br>
+JavaObject* unsafe, ...) {<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+//===--- Memory functions<br>
-------------------------------------------------===//<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory__JJB(<br>
+JavaObject* unsafe, long address, long bytes, jbyte value) {<br>
+  memset((void*)address, value, bytes);<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory__JJJ(<br>
+JavaObject* unsafe, jlong src, jlong dst, jlong size) {<br>
+  memcpy((void*)dst, (void*)src, size);<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL<br>
Java_sun_misc_Unsafe_copyMemory__Ljava_lang_Object_2JLjava_lang_Object_2JJ(<br>
+JavaObject* unsafe,<br>
+JavaObject* srcBase, jlong srcOffset,<br>
+JavaObject* dstBase, jlong dstOffset,<br>
+jlong size) {<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  uint8_t* src = fieldPtr(srcBase, srcOffset, false /* Don't throw on<br>
null base*/ );<br>
+  uint8_t* dst = fieldPtr(dstBase, dstOffset, false /* Don't throw on<br>
null base*/ );<br>
+  memcpy(dst, src, size);<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(<br>
+JavaObject* unsafe, jlong size) {<br>
+  // TODO: Invalid size/OOM/etc handling!<br>
+  jlong res = 0;<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  res = (jlong)malloc(size);<br>
+  END_NATIVE_EXCEPTION<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_reallocateMemory(<br>
+JavaObject* unsafe, jlong ptr, jlong newsize) {<br>
+  // TODO: Invalid size/OOM/etc handling!<br>
+  jlong res = 0;<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  res = (jlong)realloc((void*)ptr, newsize);<br>
+  END_NATIVE_EXCEPTION<br>
+  return res;<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(<br>
+JavaObject* unsafe, jlong ptr) {<br>
+  // TODO: Exception handling...<br>
+  BEGIN_NATIVE_EXCEPTION(0)<br>
+  free((void*)ptr);<br>
+  END_NATIVE_EXCEPTION<br>
+}<br>
+<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getAddress(<br>
+JavaObject* unsafe, jlong ptr) {<br>
+  return (jlong)*(void**)ptr;<br>
+}<br>
+<br>
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_putAddress(<br>
+JavaObject* unsafe, jlong ptr, jlong val) {<br>
+  *(void**)ptr = (void*)val;<br>
+}<br>
+<br>
+//===--- Park/Unpark thread support<br>
---------------------------------------===//<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(<br>
+JavaObject* unsafe, jboolean isAbsolute, jlong time) {<br>
+  // Nothing, for now.<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(<br>
+JavaObject* unsafe, JavaObject* thread) {<br>
+  // Nothing, for now.<br>
+}<br>
+<br>
+//===--- Monitor support<br>
--------------------------------------------------===//<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_tryMonitorEnter(<br>
+JavaObject* unsafe, JavaObject * obj) {<br>
+  //TODO: Implement me!<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_monitorEnter(<br>
+JavaObject* unsafe, JavaObject * obj) {<br>
+  //TODO: Implement me!<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_monitorExit(<br>
+JavaObject* unsafe, JavaObject * obj) {<br>
+  //TODO: Implement me!<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+//===--- Misc support functions<br>
-------------------------------------------===//<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JavaObject*) {<br>
+  // Nothing, we define the Unsafe methods with the expected signatures.<br>
+}<br>
+<br>
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(<br>
+JavaObject* unsafe, JavaObject * obj) {<br>
+  llvm_gcroot(unsafe, 0);<br>
+  llvm_gcroot(obj, 0);<br>
+<br>
+  JavaThread::get()->throwException(obj);<br>
+}<br>
+<br>
+JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_pageSize(<br>
+JavaObject* unsafe) {<br>
+  return mvm::System::GetPageSize();<br>
+}<br>
+<br>
+JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(<br>
+JavaObject* unsafe) {<br>
+  return mvm::kWordSize;<br>
+}<br>
+<br>
+JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getLoadAverage(<br>
+JavaObject* unsafe, ...) {<br>
+  UNIMPLEMENTED();<br>
+}<br>
+<br>
+}<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
</font></span><br>_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
<br></blockquote></div><br></div>