[vmkit-commits] [PATCH 1/3] Split Classpath.inc into Unsafe.inc and GNUClasspath/Classpath.inc

Nicolas Geoffray nicolas.geoffray at gmail.com
Wed Nov 16 12:09:06 PST 2011


If it's just moving around, looks good! :)

On Wed, Nov 16, 2011 at 12:14 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> Zero functionality change intended, just moving code around.
>
> Besides subject, also pull objectFieldOffset from ClasspathField.inc
>
> ~Will
>
> >From dd3f94eb84034dbdacf0fc346846392b9d6a8feb Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Tue, 15 Nov 2011 16:36:13 -0600
> Subject: [PATCH 1/3] Split Classpath.inc into Unsafe.inc and
>  GNUClasspath/Classpath.inc
>
> ---
>  lib/J3/ClassLib/Classpath.inc                |  588
> --------------------------
>  lib/J3/ClassLib/ClasspathField.inc           |   14 -
>  lib/J3/ClassLib/GNUClasspath/Classpath.inc   |  289 +++++++++++++
>  lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp |    3 +-
>  lib/J3/ClassLib/GNUClasspath/Makefile        |    8 +-
>  lib/J3/ClassLib/Makefile                     |    4 +-
>  lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp      |    2 +-
>  lib/J3/ClassLib/Unsafe.inc                   |  326 ++++++++++++++
>  8 files changed, 625 insertions(+), 609 deletions(-)
>  delete mode 100644 lib/J3/ClassLib/Classpath.inc
>  create mode 100644 lib/J3/ClassLib/GNUClasspath/Classpath.inc
>  create mode 100644 lib/J3/ClassLib/Unsafe.inc
>
> diff --git a/lib/J3/ClassLib/Classpath.inc b/lib/J3/ClassLib/Classpath.inc
> deleted file mode 100644
> index 4fb16a4..0000000
> --- a/lib/J3/ClassLib/Classpath.inc
> +++ /dev/null
> @@ -1,588 +0,0 @@
> -//===-------- Classpath.cpp - Configuration for classpath
> -------------------===//
> -//
> -//                            The VMKit project
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
>
> -//===----------------------------------------------------------------------===//
> -
> -
> -
> -#include "Classpath.h"
> -#include "ClasspathReflect.h"
> -#include "JavaClass.h"
> -#include "JavaThread.h"
> -#include "JavaUpcalls.h"
> -#include "Jnjvm.h"
> -#include "Reader.h"
> -#include "VMStaticInstance.h"
> -
> -
> -using namespace j3;
> -
> -extern "C" {
> -
> -// Convert a 'base' JavaObject to its pointer representation.
> -// Handles our special VMStaticInstance wrapper.
> -static inline uint8 *baseToPtr(JavaObject *base) {
> -  if (VMStaticInstance::isVMStaticInstance(base))
> -    return (uint8*)((VMStaticInstance*)base)->getStaticInstance();
> -  else
> -    return (uint8*)base;
> -}
> -
> -// Define hasClassInitializer because of a buggy implementation in
> Classpath.
> -JNIEXPORT bool JNICALL
> Java_java_io_VMObjectStreamClass_hasClassInitializer(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObject* Cl) {
> -
> -  llvm_gcroot(Cl, 0);
> -  bool res = false;
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(Cl);
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
> -
> -  if (cl->isClass() &&
> -
>  cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
> -
> vm->bootstrapLoader->clinitType,
> -                                           true, false, 0))
> -  res = true;
> -
> -  END_NATIVE_EXCEPTION
> -
> -  return res;
> -}
> -
> -
> -// Redefine some VMObjectStreamClass functions because of a slow
> implementation
> -// in Classpath.
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setBooleanNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jboolean val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceInt8Field(obj, (uint8)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jbyte val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceInt8Field(obj, (uint8)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jchar val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceInt16Field((JavaObject*)obj, (uint16)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jshort val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceInt16Field(obj, (sint16)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jint val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceInt32Field(obj, (sint32)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jlong val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceLongField(obj, (sint64)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jfloat val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceFloatField(obj, (float)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, jdouble val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceDoubleField(obj, (double)val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObjectField* Field, JavaObject* obj, JavaObject* val) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(obj, 0);
> -  llvm_gcroot(val, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  verifyNull(obj);
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  field->setInstanceObjectField(obj, val);
> -
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT JavaObject* JNICALL
> Java_java_io_VMObjectInputStream_allocateObject(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -JavaObject* target, JavaObject* constr, JavaObjectConstructor* cons) {
> -
> -  JavaObject* res = 0;
> -  llvm_gcroot(res, 0);
> -  llvm_gcroot(target, 0);
> -  llvm_gcroot(constr, 0);
> -  llvm_gcroot(cons, 0);
> -
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserClass* cl =
> -    (UserClass*)UserCommonClass::resolvedImplClass(vm, target, true);
> -  res = cl->doNew(vm);
> -  JavaMethod* meth = JavaObjectConstructor::getInternalMethod(cons);
> -  meth->invokeIntSpecial(vm, cl, res);
> -
> -  END_NATIVE_EXCEPTION
> -
> -  return res;
> -}
> -
> -JNIEXPORT JavaObject* JNICALL
> Java_java_lang_reflect_VMArray_createObjectArray(
> -#ifdef NATIVE_JNI
> -JNIEnv * env,
> -jclass thisClass,
> -#endif
> -JavaObject* arrayType, jint arrayLength) {
> -
> -  JavaObject* res = 0;
> -  llvm_gcroot(arrayType, 0);
> -  llvm_gcroot(res, 0);
> -
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserCommonClass* base =
> -    UserCommonClass::resolvedImplClass(vm, arrayType, true);
> -  JnjvmClassLoader* loader = base->classLoader;
> -  const UTF8* name = base->getName();
> -  // -1 because we're adding a new dimension in this method.
> -  const int kLimit = 255 - 1;
> -  const uint16* elements = name->elements;
> -  if (name->size > kLimit && elements[kLimit] == '[') {
> -    vm->illegalArgumentException("Too many dimensions for array");
> -  }
> -  const UTF8* arrayName = loader->constructArrayName(1, name);
> -  UserClassArray* array = loader->constructArray(arrayName, base);
> -  res = array->doNew(arrayLength, vm);
> -
> -  END_NATIVE_EXCEPTION
> -
> -  return res;
> -}
> -
> -
> -// Never throws.
> -JNIEXPORT
> -bool JNICALL Java_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -jclass clazz,
> -#endif
> -) {
> -  return false;
> -}
> -
> -// Never throws.
> -JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* unsafe, JavaObject* obj, jlong offset, jlong expect,
> jlong update) {
> -
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(obj, 0);
> -  jlong *ptr;
> -  jlong  value;
> -
> -  ptr = (jlong *) (((uint8 *) obj) + offset);
> -
> -  value = *ptr;
> -
> -  if (value == expect) {
> -    *ptr = update;
> -    return true;
> -  } else {
> -    return false;
> -  }
> -
> -}
> -
> -// Never throws.
> -JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* unsafe, JavaObject* obj, jlong offset, jint expect, jint
> update) {
> -
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(obj, 0);
> -  jint *ptr;
> -
> -  ptr = (jint *) (((uint8 *) obj) + offset);
> -
> -  return __sync_bool_compare_and_swap(ptr, expect, update);
> -}
> -
> -// Never throws.
> -JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* expect,
> -JavaObject* update) {
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(obj, 0);
> -  llvm_gcroot(expect, 0);
> -  llvm_gcroot(update, 0);
> -
> -  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
> -
> -  return mvm::Collector::objectReferenceTryCASBarrier((gc*)obj,
> (gc**)ptr, (gc*)expect, (gc*)update);
> -}
> -
> -// Never throws.
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* value) {
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(obj, 0);
> -  llvm_gcroot(value, 0);
> -
> -  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
> -  mvm::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr,
> (gc*)value);
> -}
> -
> -JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(
> -JavaObject* unsafe, jlong size) {
> -  // TODO: Invalid size/OOM/etc handling!
> -  jlong res = 0;
> -  BEGIN_NATIVE_EXCEPTION(0)
> -  res = (jlong)malloc(size);
> -  END_NATIVE_EXCEPTION
> -  return res;
> -}
> -
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(
> -JavaObject* unsafe, jlong ptr) {
> -  // TODO: Exception handling...
> -  BEGIN_NATIVE_EXCEPTION(0)
> -  free((void*)ptr);
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(
> -JavaObject* unsafe, jlong ptr, jlong value) {
> -  BEGIN_NATIVE_EXCEPTION(0)
> -  *(jlong*)ptr = value;
> -  END_NATIVE_EXCEPTION
> -}
> -
> -JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(
> -JavaObject* unsafe, jlong ptr) {
> -  jbyte res = 0;
> -  BEGIN_NATIVE_EXCEPTION(0)
> -  res =  *(jbyte*)ptr;
> -  END_NATIVE_EXCEPTION
> -
> -  return res;
> -}
> -
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(
> -JavaObject* unsafe, JavaObject* clazz) {
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(clazz, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -
> -  CommonClass * cl = JavaObject::getClass(clazz);
> -  assert(cl && cl->isClass());
> -  cl->asClass()->resolveClass();
> -  cl->asClass()->initialiseClass(vm);
> -
> -  END_NATIVE_EXCEPTION;
> -}
> -
> -JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(
> -JavaObject* unsafe, JavaObjectField* _field) {
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(_field, 0);
> -
> -  jlong res = 0;
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  JavaField * field = JavaObjectField::getInternalField(_field);
> -  assert(field);
> -
> -  res = field->ptrOffset;
> -
> -  END_NATIVE_EXCEPTION;
> -
> -  return res;
> -}
> -
> -JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_staticFieldBase(
> -JavaObject* unsafe, JavaObjectField* _field) {
> -  JavaObject* res = 0;
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(_field, 0);
> -  llvm_gcroot(res, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  JavaField * field = JavaObjectField::getInternalField(_field);
> -  assert(field);
> -  field->classDef->initialiseClass(JavaThread::get()->getJVM());
> -
> -  res = VMStaticInstance::allocate(field->classDef);
> -
> -  END_NATIVE_EXCEPTION;
> -
> -  return res;
> -}
> -
> -JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(
> -JavaObject* unsafe, JavaObject* base, jlong offset) {
> -  JavaObject * res = 0;
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(base, 0);
> -  llvm_gcroot(res, 0);
> -
> -  BEGIN_NATIVE_EXCEPTION(0)
> -  JavaObject** ptr = (JavaObject**) (baseToPtr(base) + offset);
> -  res = *ptr;
> -  END_NATIVE_EXCEPTION;
> -
> -  return res;
> -}
> -
> -JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(
> -JavaObject* unsafe, JavaObject* clazz) {
> -  // Array starts at beginning of object
> -  return 0;
> -}
> -
> -JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* unsafe, JavaObject* clazz) {
> -  // Return '0' if we don't support indexing this way.
> -  // (We might pack fields specially, etc)
> -  // TODO: Implement this for the array types we support this way
> -  return 0;
> -}
> -
> -JNIEXPORT JavaObject* JNICALL
>
> Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(
> -JavaObject* unsafe, JavaString *name, ArrayObject * bytesArr, jint
> off, jint len, JavaObject * loader, JavaObject * pd) {
> -  JavaObject* res = 0;
> -  llvm_gcroot(res, 0);
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(name, 0);
> -  llvm_gcroot(bytesArr, 0);
> -  llvm_gcroot(loader, 0);
> -  llvm_gcroot(pd, 0);
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  JnjvmClassLoader* JCL = NULL;
> -  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
> -
> -  jint last = off + len;
> -  if (last < bytesArr->size) {
> -    assert(0 && "What exception to throw here?");
> -  }
> -  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);
> -  memcpy(bytes->elements, JavaArray::getElements(bytesArr)+off, len);
> -  const UTF8* utfName = JavaString::javaToInternal(name, JCL->hashUTF8);
> -  UserClass *cl = JCL->constructClass(utfName, bytes);
> -
> -  if (cl) res = (JavaObject*)cl->getClassDelegatee(vm);
> -
> -  END_NATIVE_EXCEPTION;
> -
> -  return res;
> -}
> -
> -JNIEXPORT JavaObject* JNICALL
> Java_sun_misc_Unsafe_allocateInstance__Ljava_lang_Class_2(
> -JavaObject* unsafe, JavaObjectClass * clazz) {
> -  JavaObject* res = 0;
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(clazz, 0);
> -  llvm_gcroot(res, 0);
> -
> -  BEGIN_NATIVE_EXCEPTION(0)
> -
> -  JavaThread* th = JavaThread::get();
> -  Jnjvm* vm = th->getJVM();
> -
> -  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz,
> true);
> -  if (cl->isClass())
> -    res = cl->asClass()->doNew(vm);
> -
> -  END_NATIVE_EXCEPTION;
> -
> -  return res;
> -}
> -
> -
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(
> -JavaObject* unsafe, JavaObject * obj) {
> -  llvm_gcroot(unsafe, 0);
> -  llvm_gcroot(obj, 0);
> -
> -  JavaThread::get()->throwException(obj);
> -}
> -
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JavaObject*) {
> -  // Nothing
> -}
> -
> -// TODO: Add the Volatile variants
> -#define GET_PUT_OFFSET(Type,jtype,shorttype) \
> -JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ##
> __Ljava_lang_Object_2J( \
> -JavaObject* unsafe, JavaObject* base, jlong offset) { \
> -  jtype res = 0; \
> -  BEGIN_NATIVE_EXCEPTION(0) \
> -  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \
> -  res = *ptr; \
> -  END_NATIVE_EXCEPTION \
> - \
> -  return res; \
> -} \
> - \
> -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##
> __Ljava_lang_Object_2J ## shorttype( \
> -JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \
> -  BEGIN_NATIVE_EXCEPTION(0) \
> -  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \
> -  *ptr = val; \
> -  END_NATIVE_EXCEPTION \
> -}
> -
> -GET_PUT_OFFSET(Boolean,jboolean,Z)
> -GET_PUT_OFFSET(Byte,jbyte,B)
> -GET_PUT_OFFSET(Char,jchar,C)
> -GET_PUT_OFFSET(Short,jshort,S)
> -GET_PUT_OFFSET(Int,jint,I)
> -GET_PUT_OFFSET(Long,jlong,J)
> -GET_PUT_OFFSET(Float,jfloat,F)
> -GET_PUT_OFFSET(Double,jdouble,D)
> -
> -}
> diff --git a/lib/J3/ClassLib/ClasspathField.inc
> b/lib/J3/ClassLib/ClasspathField.inc
> index e56c82f..010c54b 100644
> --- a/lib/J3/ClassLib/ClasspathField.inc
> +++ b/lib/J3/ClassLib/ClasspathField.inc
> @@ -1154,18 +1154,4 @@ JavaObjectField* Field, JavaObject* obj, jdouble
> val) {
>   END_NATIVE_EXCEPTION
>  }
>
> -// Never throws.
> -JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(
> -#ifdef NATIVE_JNI
> -JNIEnv *env,
> -#endif
> -JavaObject* Unsafe, JavaObjectField* Field) {
> -
> -  llvm_gcroot(Field, 0);
> -  llvm_gcroot(Unsafe, 0);
> -
> -  JavaField* field = JavaObjectField::getInternalField(Field);
> -  return (jlong)field->ptrOffset;
> -}
> -
>  }
> diff --git a/lib/J3/ClassLib/GNUClasspath/Classpath.inc
> b/lib/J3/ClassLib/GNUClasspath/Classpath.inc
> new file mode 100644
> index 0000000..3354774
> --- /dev/null
> +++ b/lib/J3/ClassLib/GNUClasspath/Classpath.inc
> @@ -0,0 +1,289 @@
> +//===-------- Classpath.cpp - Configuration for classpath
> -------------------===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +
> +
> +#include "Classpath.h"
> +#include "ClasspathReflect.h"
> +#include "JavaClass.h"
> +#include "JavaThread.h"
> +#include "JavaUpcalls.h"
> +#include "Jnjvm.h"
> +#include "Reader.h"
> +
> +using namespace j3;
> +
> +extern "C" {
> +
> +// Define hasClassInitializer because of a buggy implementation in
> Classpath.
> +JNIEXPORT bool JNICALL
> Java_java_io_VMObjectStreamClass_hasClassInitializer(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObject* Cl) {
> +
> +  llvm_gcroot(Cl, 0);
> +  bool res = false;
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(Cl);
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
> +
> +  if (cl->isClass() &&
> +
>  cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
> +
> vm->bootstrapLoader->clinitType,
> +                                           true, false, 0))
> +  res = true;
> +
> +  END_NATIVE_EXCEPTION
> +
> +  return res;
> +}
> +
> +
> +// Redefine some VMObjectStreamClass functions because of a slow
> implementation
> +// in Classpath.
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setBooleanNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jboolean val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceInt8Field(obj, (uint8)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jbyte val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceInt8Field(obj, (uint8)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jchar val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceInt16Field((JavaObject*)obj, (uint16)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jshort val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceInt16Field(obj, (sint16)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jint val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceInt32Field(obj, (sint32)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jlong val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceLongField(obj, (sint64)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jfloat val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceFloatField(obj, (float)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, jdouble val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceDoubleField(obj, (double)val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObjectField* Field, JavaObject* obj, JavaObject* val) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(obj, 0);
> +  llvm_gcroot(val, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  verifyNull(obj);
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  field->setInstanceObjectField(obj, val);
> +
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT JavaObject* JNICALL
> Java_java_io_VMObjectInputStream_allocateObject(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +JavaObject* target, JavaObject* constr, JavaObjectConstructor* cons) {
> +
> +  JavaObject* res = 0;
> +  llvm_gcroot(res, 0);
> +  llvm_gcroot(target, 0);
> +  llvm_gcroot(constr, 0);
> +  llvm_gcroot(cons, 0);
> +
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* cl =
> +    (UserClass*)UserCommonClass::resolvedImplClass(vm, target, true);
> +  res = cl->doNew(vm);
> +  JavaMethod* meth = JavaObjectConstructor::getInternalMethod(cons);
> +  meth->invokeIntSpecial(vm, cl, res);
> +
> +  END_NATIVE_EXCEPTION
> +
> +  return res;
> +}
> +
> +JNIEXPORT JavaObject* JNICALL
> Java_java_lang_reflect_VMArray_createObjectArray(
> +#ifdef NATIVE_JNI
> +JNIEnv * env,
> +jclass thisClass,
> +#endif
> +JavaObject* arrayType, jint arrayLength) {
> +
> +  JavaObject* res = 0;
> +  llvm_gcroot(arrayType, 0);
> +  llvm_gcroot(res, 0);
> +
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* base =
> +    UserCommonClass::resolvedImplClass(vm, arrayType, true);
> +  JnjvmClassLoader* loader = base->classLoader;
> +  const UTF8* name = base->getName();
> +  // -1 because we're adding a new dimension in this method.
> +  const int kLimit = 255 - 1;
> +  const uint16* elements = name->elements;
> +  if (name->size > kLimit && elements[kLimit] == '[') {
> +    vm->illegalArgumentException("Too many dimensions for array");
> +  }
> +  const UTF8* arrayName = loader->constructArrayName(1, name);
> +  UserClassArray* array = loader->constructArray(arrayName, base);
> +  res = array->doNew(arrayLength, vm);
> +
> +  END_NATIVE_EXCEPTION
> +
> +  return res;
> +}
> +
> +// Never throws.
> +JNIEXPORT
> +bool JNICALL Java_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +jclass clazz,
> +#endif
> +) {
> +  return false;
> +}
> +
> +}
> diff --git a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> index bc797d1..57197c4 100644
> --- a/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/GNUClasspath/JavaUpcalls.cpp
> @@ -1071,8 +1071,8 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {
>
>  }
>
> -#include "ClasspathConstructor.inc"
>  #include "Classpath.inc"
> +#include "ClasspathConstructor.inc"
>  #include "ClasspathField.inc"
>  #include "ClasspathMethod.inc"
>  #include "ClasspathVMClass.inc"
> @@ -1084,3 +1084,4 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {
>  #include "ClasspathVMSystemProperties.inc"
>  #include "ClasspathVMThread.inc"
>  #include "ClasspathVMThrowable.inc"
> +#include "Unsafe.inc"
> diff --git a/lib/J3/ClassLib/GNUClasspath/Makefile
> b/lib/J3/ClassLib/GNUClasspath/Makefile
> index be80b9e..f5939c9 100644
> --- a/lib/J3/ClassLib/GNUClasspath/Makefile
> +++ b/lib/J3/ClassLib/GNUClasspath/Makefile
> @@ -9,9 +9,11 @@
>  LEVEL = ../../../..
>
>
> -EXTRA_DIST = ClasspathVMClass.inc ClasspathVMClassLoader.inc
> ClasspathVMObject.inc \
> -            ClasspathVMRuntime.inc ClasspathVMStackWalker.inc
> ClasspathVMSystem.inc \
> -            ClasspathVMSystemProperties.inc ClasspathVMThread.inc
> ClasspathVMThrowable.inc
> +EXTRA_DIST = Classpath.inc ClasspathVMClass.inc
> ClasspathVMClassLoader.inc \
> +             ClasspathVMObject.inc ClasspathVMRuntime.inc \
> +             ClasspathVMStackWalker.inc ClasspathVMSystem.inc \
> +             ClasspathVMSystemProperties.inc ClasspathVMThread.inc \
> +             ClasspathVMThrowable.inc
>
>  include $(LEVEL)/Makefile.config
>
> diff --git a/lib/J3/ClassLib/Makefile b/lib/J3/ClassLib/Makefile
> index 8252b92..8fd7e2a 100644
> --- a/lib/J3/ClassLib/Makefile
> +++ b/lib/J3/ClassLib/Makefile
> @@ -12,9 +12,9 @@ EXTRA_DIST = ArrayCopy.inc \
>              ClassContext.inc \
>              ClasspathConstructor.inc \
>              ClasspathField.inc \
> -             Classpath.inc \
>              ClasspathMethod.inc \
> -             SetProperties.inc
> +             SetProperties.inc \
> +             Unsafe.inc
>
>  include $(LEVEL)/Makefile.config
>
> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> index 22db276..3fa6390 100644
> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> @@ -897,7 +897,7 @@ void Classpath::InitializeSystem(Jnjvm * jvm) {
>
>
>  #include "ClasspathConstructor.inc"
> -#include "Classpath.inc"
>  #include "ClasspathField.inc"
>  #include "ClasspathMethod.inc"
>  #include "OpenJDK.inc"
> +#include "Unsafe.inc"
> diff --git a/lib/J3/ClassLib/Unsafe.inc b/lib/J3/ClassLib/Unsafe.inc
> new file mode 100644
> index 0000000..dcccc65
> --- /dev/null
> +++ b/lib/J3/ClassLib/Unsafe.inc
> @@ -0,0 +1,326 @@
> +//===-------- Unsafe.inc - sun.misc.Unsafe implementation
> -----------------===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "VMStaticInstance.h"
> +#include <stdlib.h>
> +
> +// Convert a 'base' JavaObject to its pointer representation.
> +// Handles our special VMStaticInstance wrapper.
> +static inline uint8 *baseToPtr(JavaObject *base) {
> +  if (VMStaticInstance::isVMStaticInstance(base))
> +    return (uint8*)((VMStaticInstance*)base)->getStaticInstance();
> +  else
> +    return (uint8*)base;
> +}
> +
> +extern "C" {
> +
> +// Never throws.
> +JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* unsafe, JavaObject* obj, jlong offset, jlong expect,
> jlong update) {
> +
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(obj, 0);
> +  jlong *ptr;
> +  jlong  value;
> +
> +  ptr = (jlong *) (((uint8 *) obj) + offset);
> +
> +  value = *ptr;
> +
> +  if (value == expect) {
> +    *ptr = update;
> +    return true;
> +  } else {
> +    return false;
> +  }
> +
> +}
> +
> +// Never throws.
> +JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* unsafe, JavaObject* obj, jlong offset, jint expect, jint
> update) {
> +
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(obj, 0);
> +  jint *ptr;
> +
> +  ptr = (jint *) (((uint8 *) obj) + offset);
> +
> +  return __sync_bool_compare_and_swap(ptr, expect, update);
> +}
> +
> +// Never throws.
> +JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* expect,
> +JavaObject* update) {
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(obj, 0);
> +  llvm_gcroot(expect, 0);
> +  llvm_gcroot(update, 0);
> +
> +  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
> +
> +  return mvm::Collector::objectReferenceTryCASBarrier((gc*)obj,
> (gc**)ptr, (gc*)expect, (gc*)update);
> +}
> +
> +// Never throws.
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* unsafe, JavaObject* obj, jlong offset, JavaObject* value) {
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(obj, 0);
> +  llvm_gcroot(value, 0);
> +
> +  JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
> +  mvm::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr,
> (gc*)value);
> +}
> +
> +JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(
> +JavaObject* unsafe, jlong size) {
> +  // TODO: Invalid size/OOM/etc handling!
> +  jlong res = 0;
> +  BEGIN_NATIVE_EXCEPTION(0)
> +  res = (jlong)malloc(size);
> +  END_NATIVE_EXCEPTION
> +  return res;
> +}
> +
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(
> +JavaObject* unsafe, jlong ptr) {
> +  // TODO: Exception handling...
> +  BEGIN_NATIVE_EXCEPTION(0)
> +  free((void*)ptr);
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(
> +JavaObject* unsafe, jlong ptr, jlong value) {
> +  BEGIN_NATIVE_EXCEPTION(0)
> +  *(jlong*)ptr = value;
> +  END_NATIVE_EXCEPTION
> +}
> +
> +JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(
> +JavaObject* unsafe, jlong ptr) {
> +  jbyte res = 0;
> +  BEGIN_NATIVE_EXCEPTION(0)
> +  res =  *(jbyte*)ptr;
> +  END_NATIVE_EXCEPTION
> +
> +  return res;
> +}
> +
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(
> +JavaObject* unsafe, JavaObject* clazz) {
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(clazz, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +
> +  CommonClass * cl = JavaObject::getClass(clazz);
> +  assert(cl && cl->isClass());
> +  cl->asClass()->resolveClass();
> +  cl->asClass()->initialiseClass(vm);
> +
> +  END_NATIVE_EXCEPTION;
> +}
> +
> +JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(
> +JavaObject* unsafe, JavaObjectField* _field) {
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(_field, 0);
> +
> +  jlong res = 0;
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  JavaField * field = JavaObjectField::getInternalField(_field);
> +  assert(field);
> +
> +  res = field->ptrOffset;
> +
> +  END_NATIVE_EXCEPTION;
> +
> +  return res;
> +}
> +
> +JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_staticFieldBase(
> +JavaObject* unsafe, JavaObjectField* _field) {
> +  JavaObject* res = 0;
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(_field, 0);
> +  llvm_gcroot(res, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  JavaField * field = JavaObjectField::getInternalField(_field);
> +  assert(field);
> +  field->classDef->initialiseClass(JavaThread::get()->getJVM());
> +
> +  res = VMStaticInstance::allocate(field->classDef);
> +
> +  END_NATIVE_EXCEPTION;
> +
> +  return res;
> +}
> +
> +/// objectFieldOffset - Pointer offset of the specified field
> +///
> +JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* Unsafe, JavaObjectField* Field) {
> +
> +  llvm_gcroot(Field, 0);
> +  llvm_gcroot(Unsafe, 0);
> +
> +  JavaField* field = JavaObjectField::getInternalField(Field);
> +  return (jlong)field->ptrOffset;
> +}
> +
> +JNIEXPORT JavaObject* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(
> +JavaObject* unsafe, JavaObject* base, jlong offset) {
> +  JavaObject * res = 0;
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(base, 0);
> +  llvm_gcroot(res, 0);
> +
> +  BEGIN_NATIVE_EXCEPTION(0)
> +  JavaObject** ptr = (JavaObject**) (baseToPtr(base) + offset);
> +  res = *ptr;
> +  END_NATIVE_EXCEPTION;
> +
> +  return res;
> +}
> +
> +JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(
> +JavaObject* unsafe, JavaObject* clazz) {
> +  // Array starts at beginning of object
> +  return 0;
> +}
> +
> +JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(
> +#ifdef NATIVE_JNI
> +JNIEnv *env,
> +#endif
> +JavaObject* unsafe, JavaObject* clazz) {
> +  // Return '0' if we don't support indexing this way.
> +  // (We might pack fields specially, etc)
> +  // TODO: Implement this for the array types we support this way
> +  return 0;
> +}
> +
> +JNIEXPORT JavaObject* JNICALL
>
> Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(
> +JavaObject* unsafe, JavaString *name, ArrayObject * bytesArr, jint
> off, jint len, JavaObject * loader, JavaObject * pd) {
> +  JavaObject* res = 0;
> +  llvm_gcroot(res, 0);
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(name, 0);
> +  llvm_gcroot(bytesArr, 0);
> +  llvm_gcroot(loader, 0);
> +  llvm_gcroot(pd, 0);
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  JnjvmClassLoader* JCL = NULL;
> +  JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
> +
> +  jint last = off + len;
> +  if (last < bytesArr->size) {
> +    assert(0 && "What exception to throw here?");
> +  }
> +  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);
> +  memcpy(bytes->elements, JavaArray::getElements(bytesArr)+off, len);
> +  const UTF8* utfName = JavaString::javaToInternal(name, JCL->hashUTF8);
> +  UserClass *cl = JCL->constructClass(utfName, bytes);
> +
> +  if (cl) res = (JavaObject*)cl->getClassDelegatee(vm);
> +
> +  END_NATIVE_EXCEPTION;
> +
> +  return res;
> +}
> +
> +JNIEXPORT JavaObject* JNICALL
> Java_sun_misc_Unsafe_allocateInstance__Ljava_lang_Class_2(
> +JavaObject* unsafe, JavaObjectClass * clazz) {
> +  JavaObject* res = 0;
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(clazz, 0);
> +  llvm_gcroot(res, 0);
> +
> +  BEGIN_NATIVE_EXCEPTION(0)
> +
> +  JavaThread* th = JavaThread::get();
> +  Jnjvm* vm = th->getJVM();
> +
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz,
> true);
> +  if (cl->isClass())
> +    res = cl->asClass()->doNew(vm);
> +
> +  END_NATIVE_EXCEPTION;
> +
> +  return res;
> +}
> +
> +
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(
> +JavaObject* unsafe, JavaObject * obj) {
> +  llvm_gcroot(unsafe, 0);
> +  llvm_gcroot(obj, 0);
> +
> +  JavaThread::get()->throwException(obj);
> +}
> +
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JavaObject*) {
> +  // Nothing
> +}
> +
> +// TODO: Add the Volatile variants
> +#define GET_PUT_OFFSET(Type,jtype,shorttype) \
> +JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get ## Type ##
> __Ljava_lang_Object_2J( \
> +JavaObject* unsafe, JavaObject* base, jlong offset) { \
> +  jtype res = 0; \
> +  BEGIN_NATIVE_EXCEPTION(0) \
> +  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \
> +  res = *ptr; \
> +  END_NATIVE_EXCEPTION \
> + \
> +  return res; \
> +} \
> + \
> +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## Type ##
> __Ljava_lang_Object_2J ## shorttype( \
> +JavaObject* unsafe, JavaObject* base, jlong offset, jtype val) { \
> +  BEGIN_NATIVE_EXCEPTION(0) \
> +  jtype* ptr = (jtype*) (baseToPtr(base) + offset); \
> +  *ptr = val; \
> +  END_NATIVE_EXCEPTION \
> +}
> +
> +GET_PUT_OFFSET(Boolean,jboolean,Z)
> +GET_PUT_OFFSET(Byte,jbyte,B)
> +GET_PUT_OFFSET(Char,jchar,C)
> +GET_PUT_OFFSET(Short,jshort,S)
> +GET_PUT_OFFSET(Int,jint,I)
> +GET_PUT_OFFSET(Long,jlong,J)
> +GET_PUT_OFFSET(Float,jfloat,F)
> +GET_PUT_OFFSET(Double,jdouble,D)
> +
> +}
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111116/e6719802/attachment.html>


More information about the vmkit-commits mailing list