PR156: Preparation
[cacao.git] / src / vm / javaobjects.hpp
index 09bf71e26c0ef1c7096a95819894bdd9e0d9e7cb..d4463d33f7562da5e868d420b6fb6366e21cf35e 100644 (file)
@@ -1,6 +1,8 @@
 /* src/vm/javaobjects.hpp - functions to create and access Java objects
 
-   Copyright (C) 2008 Theobroma Systems Ltd.
+   Copyright (C) 2010, 2011
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+   Copyright (C) 2008, 2009 Theobroma Systems Ltd.
 
    This file is part of CACAO.
 
 
 #include <stdint.h>
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
 #include "native/llni.h"
 
-#include "vm/class.h"
-#include "vm/field.h"
+#include "threads/atomic.hpp"
+
+#include "vm/class.hpp"
+#include "vm/field.hpp"
 #include "vm/global.h"
 #include "vm/globals.hpp"
-#include "vm/method.h"
+#include "vm/method.hpp"
 
 
 #ifdef __cplusplus
@@ -77,77 +81,106 @@ template<class T> inline void RawFieldAccess::raw_set(void* address, const off_t
  * afterwards.
  */
 class FieldAccess : private RawFieldAccess {
-protected:
+public:
+       // Normal field accessors.
        template<class T> static inline T    get(java_handle_t* h, const off_t offset);
        template<class T> static inline void set(java_handle_t* h, const off_t offset, T value);
+
+       // Volatile field accessors.
+       template<class T> static inline T    get_volatile(java_handle_t* h, const off_t offset);
+       template<class T> static inline void set_volatile(java_handle_t* h, const off_t offset, T value);
 };
 
+
 template<class T> inline T FieldAccess::get(java_handle_t* h, const off_t offset)
 {
-       java_object_t* o;
-       T result;
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       GC::critical_enter();
+       // XXX This should be _handle->get_object();
+       java_object_t* ho = LLNI_UNWRAP(h);
+       return raw_get<T>(ho, offset);
+}
+
+template<> inline java_handle_t* FieldAccess::get(java_handle_t* h, const off_t offset)
+{
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
        // XXX This should be _handle->get_object();
-       o = LLNI_UNWRAP(h);
+       java_object_t* o = LLNI_UNWRAP(h);
+       java_object_t* result = raw_get<java_object_t*>(o, offset);
+       return LLNI_WRAP(result);
+}      
 
-       result = raw_get<T>(o, offset);
 
-       GC::critical_leave();
+template<class T> inline void FieldAccess::set(java_handle_t* h, const off_t offset, T value)
+{
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       return result;
+       java_object_t* ho = LLNI_UNWRAP(h);
+       raw_set(ho, offset, value);
 }
 
-template<> inline java_handle_t* FieldAccess::get(java_handle_t* h, const off_t offset)
+template<> inline void FieldAccess::set<java_handle_t*>(java_handle_t* h, const off_t offset, java_handle_t* value)
 {
-       java_object_t* o;
-       java_object_t* result;
-       java_handle_t* hresult;
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       GC::critical_enter();
+       // XXX This should be h->get_object();
+       java_object_t* o      = LLNI_UNWRAP(h);
+       java_object_t* ovalue = LLNI_UNWRAP(value);
+       raw_set(o, offset, ovalue);
+}
 
-       // XXX This should be _handle->get_object();
-       o = LLNI_UNWRAP(h);
 
-       result = raw_get<java_object_t*>(o, offset);
+template<class T> inline T FieldAccess::get_volatile(java_handle_t* h, const off_t offset)
+{
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       hresult = LLNI_WRAP(result);
+       // XXX This should be _handle->get_object();
+       java_object_t* ho = LLNI_UNWRAP(h);
+       return raw_get<volatile T>(ho, offset);
+}
 
-       GC::critical_leave();
+template<> inline java_handle_t* FieldAccess::get_volatile(java_handle_t* h, const off_t offset)
+{
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       return hresult;
+       // XXX This should be _handle->get_object();
+       java_object_t* o = LLNI_UNWRAP(h);
+       java_object_t* result = (java_object_t*) raw_get<volatile java_object_t*>(o, offset);
+       return LLNI_WRAP(result);
 }      
 
 
-template<class T> inline void FieldAccess::set(java_handle_t* h, const off_t offset, T value)
+template<class T> inline void FieldAccess::set_volatile(java_handle_t* h, const off_t offset, T value)
 {
-       java_object_t* o;
-
-       GC::critical_enter();
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       // XXX This should be h->get_object();
-       o = LLNI_UNWRAP(h);
+       java_object_t* ho = LLNI_UNWRAP(h);
+       raw_set(ho, offset, (volatile T) value);
 
-       raw_set(o, offset, value);
-
-       GC::critical_leave();
+       // Memory barrier for the Java Memory Model.
+       Atomic::memory_barrier();
 }
 
-template<> inline void FieldAccess::set<java_handle_t*>(java_handle_t* h, const off_t offset, java_handle_t* value)
+template<> inline void FieldAccess::set_volatile<java_handle_t*>(java_handle_t* h, const off_t offset, java_handle_t* value)
 {
-       java_object_t* o;
-       java_object_t* ovalue;
-
-       GC::critical_enter();
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
        // XXX This should be h->get_object();
-       o      = LLNI_UNWRAP(h);
-       ovalue = LLNI_UNWRAP(value);
-
-       raw_set(o, offset, ovalue);
+       java_object_t* o      = LLNI_UNWRAP(h);
+       java_object_t* ovalue = LLNI_UNWRAP(value);
+       raw_set(o, offset, (volatile java_object_t*) ovalue);
 
-       GC::critical_leave();
+       // Memory barrier for the Java Memory Model.
+       Atomic::memory_barrier();
 }
 
 
@@ -166,30 +199,27 @@ protected:
 public:
        java_lang_Object() : _handle(NULL) {}
        java_lang_Object(java_handle_t* h) : _handle(h) {}
-       java_lang_Object(jobject h) : _handle((java_handle_t*) h) {}
        virtual ~java_lang_Object() {}
 
        // Getters.
-       virtual inline java_handle_t* get_handle() const { return _handle; }
-       inline vftbl_t*               get_vftbl () const;
-       inline classinfo*             get_Class () const;
+       virtual java_handle_t* get_handle  () const { return _handle; }
+       vftbl_t*               get_vftbl   () const;
+       classinfo*             get_Class   () const;
+       int32_t                get_hashcode() const;
 
-       inline bool is_null    () const;
-       inline bool is_non_null() const;
+       bool is_null    () const;
+       bool is_non_null() const;
 };
 
 
 inline vftbl_t* java_lang_Object::get_vftbl() const
 {
-       GC::critical_enter();
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
        // XXX This should be h->get_object();
        java_object_t* o = LLNI_UNWRAP(_handle);
-       vftbl_t* vftbl = o->vftbl;
-
-       GC::critical_leave();
-
-       return vftbl;
+       return o->vftbl;
 }
 
 inline classinfo* java_lang_Object::get_Class() const
@@ -197,6 +227,20 @@ inline classinfo* java_lang_Object::get_Class() const
        return get_vftbl()->clazz;
 }
 
+inline int32_t java_lang_Object::get_hashcode() const
+{
+#if defined(ENABLE_GC_CACAO)
+       return heap_get_hashcode(_handle);
+#else
+       // This function is inside a critical section.
+       GCCriticalSection cs;
+
+       // XXX This should be h->get_object();
+       java_object_t* o = LLNI_UNWRAP(_handle);
+       return (int32_t) (intptr_t) o;
+#endif
+}
+
 
 inline bool java_lang_Object::is_null() const
 {
@@ -226,8 +270,8 @@ private:
 public:
        java_lang_Boolean(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline uint8_t get_value();
-       inline void    set_value(uint8_t value);
+       uint8_t get_value();
+       void    set_value(uint8_t value);
 };
 
 inline uint8_t java_lang_Boolean::get_value()
@@ -258,8 +302,8 @@ private:
 public:
        java_lang_Byte(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline int8_t get_value();
-       inline void   set_value(int8_t value);
+       int8_t get_value();
+       void   set_value(int8_t value);
 };
 
 inline int8_t java_lang_Byte::get_value()
@@ -290,8 +334,8 @@ private:
 public:
        java_lang_Character(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline uint16_t get_value();
-       inline void     set_value(uint16_t value);
+       uint16_t get_value();
+       void     set_value(uint16_t value);
 };
 
 inline uint16_t java_lang_Character::get_value()
@@ -322,8 +366,8 @@ private:
 public:
        java_lang_Short(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline int16_t get_value();
-       inline void    set_value(int16_t value);
+       int16_t get_value();
+       void    set_value(int16_t value);
 };
 
 inline int16_t java_lang_Short::get_value()
@@ -354,8 +398,8 @@ private:
 public:
        java_lang_Integer(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline int32_t get_value();
-       inline void    set_value(int32_t value);
+       int32_t get_value();
+       void    set_value(int32_t value);
 };
 
 inline int32_t java_lang_Integer::get_value()
@@ -386,8 +430,8 @@ private:
 public:
        java_lang_Long(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline int64_t get_value();
-       inline void    set_value(int64_t value);
+       int64_t get_value();
+       void    set_value(int64_t value);
 };
 
 inline int64_t java_lang_Long::get_value()
@@ -418,8 +462,8 @@ private:
 public:
        java_lang_Float(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline float get_value();
-       inline void  set_value(float value);
+       float get_value();
+       void  set_value(float value);
 };
 
 inline float java_lang_Float::get_value()
@@ -450,8 +494,8 @@ private:
 public:
        java_lang_Double(java_handle_t* h) : java_lang_Object(h) {}
 
-       inline double get_value();
-       inline void   set_value(double value);
+       double get_value();
+       void   set_value(double value);
 };
 
 inline double java_lang_Double::get_value()
@@ -467,6 +511,21 @@ inline void java_lang_Double::set_value(double value)
 
 #if defined(ENABLE_JAVASE)
 
+/**
+ * java/lang/management/MemoryUsage
+ *
+ * Object layout:
+ *
+ * 0. object header
+ * [other fields are not used]
+ */
+class java_lang_management_MemoryUsage : public java_lang_Object, private FieldAccess {
+public:
+       java_lang_management_MemoryUsage(java_handle_t* h) : java_lang_Object(h) {}
+       java_lang_management_MemoryUsage(int64_t init, int64_t used, int64_t commited, int64_t maximum);
+};
+
+
 # if defined(ENABLE_ANNOTATIONS)
 /**
  * OpenJDK sun/reflect/ConstantPool
@@ -487,8 +546,8 @@ public:
        sun_reflect_ConstantPool(java_handle_t* h, jclass constantPoolOop);
 
        // Setters.
-       inline void set_constantPoolOop(classinfo* value);
-       inline void set_constantPoolOop(jclass value);
+       void set_constantPoolOop(classinfo* value);
+       void set_constantPoolOop(jclass value);
 };
 
 
@@ -512,6 +571,8 @@ inline void sun_reflect_ConstantPool::set_constantPoolOop(jclass value)
 
 #endif // ENABLE_JAVASE
 
+void jobjects_register_dyn_offsets();
+bool jobjects_run_dynoffsets_hook(classinfo *c);
 
 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
@@ -539,8 +600,7 @@ public:
        java_lang_Class(java_handle_t* h) : java_lang_Object(h) {}
 
        // Setters.
-       inline void set_pd(java_handle_t* value);
-       inline void set_pd(jobject value);
+       void set_pd(java_handle_t* value);
 };
 
 inline void java_lang_Class::set_pd(java_handle_t* value)
@@ -548,9 +608,37 @@ inline void java_lang_Class::set_pd(java_handle_t* value)
        set(_handle, offset_pd, value);
 }
 
-inline void java_lang_Class::set_pd(jobject value)
+
+/**
+ * GNU Classpath java/lang/ClassLoader
+ *
+ * Object layout:
+ *
+ * 0. object header
+ * 1. java.util.HashMap     definedPackages
+ * 2. java.lang.ClassLoader parent
+ * [other fields are not used]
+ */
+class java_lang_ClassLoader : public java_lang_Object, private FieldAccess {
+private:
+       // Static offsets of the object's instance fields.
+       // TODO These offsets need to be checked on VM startup.
+       static const off_t offset_definedPackages = MEMORY_ALIGN(sizeof(java_object_t),                  SIZEOF_VOID_P);
+       static const off_t offset_parent          = MEMORY_ALIGN(offset_definedPackages + SIZEOF_VOID_P, SIZEOF_VOID_P);
+
+public:
+       java_lang_ClassLoader(java_handle_t* h) : java_lang_Object(h) {}
+
+       // Getters.
+       java_handle_t* get_parent() const;
+
+       // Invocation wrappers for static methods.
+       static java_handle_t* invoke_getSystemClassLoader();
+};
+
+inline java_handle_t* java_lang_ClassLoader::get_parent() const
 {
-       set_pd((java_handle_t*) value);
+       return get<java_handle_t*>(_handle, offset_parent);
 }
 
 
@@ -615,25 +703,19 @@ private:
 
 public:
        java_lang_String(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_String(jstring h);
        java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset = 0);
 
        // Getters.
-       inline java_handle_chararray_t* get_value () const;
-       inline int32_t                  get_count () const;
-       inline int32_t                  get_offset() const;
+       java_handle_chararray_t* get_value () const;
+       int32_t                  get_count () const;
+       int32_t                  get_offset() const;
 
        // Setters.
-       inline void set_value (java_handle_chararray_t* value);
-       inline void set_count (int32_t value);
-       inline void set_offset(int32_t value);
+       void set_value (java_handle_chararray_t* value);
+       void set_count (int32_t value);
+       void set_offset(int32_t value);
 };
 
-inline java_lang_String::java_lang_String(jstring h) : java_lang_Object(h)
-{
-       java_lang_String((java_handle_t*) h);
-}
-
 inline java_lang_String::java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset) : java_lang_Object(h)
 {
        set_value(value);
@@ -717,15 +799,15 @@ public:
 //     java_lang_Thread(threadobject* t);
 
        // Getters.
-       inline java_handle_t* get_vmThread        () const;
-       inline java_handle_t* get_group           () const;
-       inline java_handle_t* get_name            () const;
-       inline int32_t        get_daemon          () const;
-       inline int32_t        get_priority        () const;
-       inline java_handle_t* get_exceptionHandler() const;
+       java_handle_t* get_vmThread        () const;
+       java_handle_t* get_group           () const;
+       java_handle_t* get_name            () const;
+       int32_t        get_daemon          () const;
+       int32_t        get_priority        () const;
+       java_handle_t* get_exceptionHandler() const;
 
        // Setters.
-       inline void set_group(java_handle_t* value);
+       void set_group(java_handle_t* value);
 };
 
 
@@ -792,24 +874,18 @@ private:
 
 public:
        java_lang_VMThread(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_VMThread(jobject h);
        java_lang_VMThread(java_handle_t* h, java_handle_t* thread, threadobject* vmdata);
 
        // Getters.
-       inline java_handle_t* get_thread() const;
-       inline threadobject*  get_vmdata() const;
+       java_handle_t* get_thread() const;
+       threadobject*  get_vmdata() const;
 
        // Setters.
-       inline void set_thread(java_handle_t* value);
-       inline void set_vmdata(threadobject* value);
+       void set_thread(java_handle_t* value);
+       void set_vmdata(threadobject* value);
 };
 
 
-inline java_lang_VMThread::java_lang_VMThread(jobject h) : java_lang_Object(h)
-{
-       java_lang_VMThread((java_handle_t*) h);
-}
-
 inline java_lang_VMThread::java_lang_VMThread(java_handle_t* h, java_handle_t* thread, threadobject* vmdata) : java_lang_Object(h)
 {
        set_thread(thread);
@@ -863,9 +939,9 @@ public:
        java_lang_Throwable(java_handle_t* h) : java_lang_Object(h) {}
 
        // Getters.
-       inline java_handle_t* get_detailMessage() const;
-       inline java_handle_t* get_cause        () const;
-       inline java_handle_t* get_vmState      () const;
+       java_handle_t* get_detailMessage() const;
+       java_handle_t* get_cause        () const;
+       java_handle_t* get_vmState      () const;
 };
 
 
@@ -901,16 +977,11 @@ private:
 
 public:
        java_lang_VMThrowable(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_VMThrowable(jobject h);
 
-       inline java_handle_bytearray_t* get_vmdata() const;
-       inline void                     set_vmdata(java_handle_bytearray_t* value);
+       java_handle_bytearray_t* get_vmdata() const;
+       void                     set_vmdata(java_handle_bytearray_t* value);
 };
 
-inline java_lang_VMThrowable::java_lang_VMThrowable(jobject h) : java_lang_Object(h)
-{
-       java_lang_VMThrowable((java_handle_t*) h);
-}
 
 inline java_handle_bytearray_t* java_lang_VMThrowable::get_vmdata() const
 {
@@ -949,35 +1020,29 @@ private:
 
 public:
        java_lang_reflect_VMConstructor(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_VMConstructor(jobject h);
        java_lang_reflect_VMConstructor(methodinfo* m);
 
        // Getters.
-       inline classinfo*               get_clazz               () const;
-       inline int32_t                  get_slot                () const;
-       inline java_handle_bytearray_t* get_annotations         () const;
-       inline java_handle_bytearray_t* get_parameterAnnotations() const;
-       inline java_handle_t*           get_declaredAnnotations () const;
-       inline java_handle_t*           get_cons                () const;
+       classinfo*               get_clazz               () const;
+       int32_t                  get_slot                () const;
+       java_handle_bytearray_t* get_annotations         () const;
+       java_handle_bytearray_t* get_parameterAnnotations() const;
+       java_handle_t*           get_declaredAnnotations () const;
+       java_handle_t*           get_cons                () const;
 
        // Setters.
-       inline void set_clazz               (classinfo* value);
-       inline void set_slot                (int32_t value);
-       inline void set_annotations         (java_handle_bytearray_t* value);
-       inline void set_parameterAnnotations(java_handle_bytearray_t* value);
-       inline void set_declaredAnnotations (java_handle_t* value);
-       inline void set_cons                (java_handle_t* value);
+       void set_clazz               (classinfo* value);
+       void set_slot                (int32_t value);
+       void set_annotations         (java_handle_bytearray_t* value);
+       void set_parameterAnnotations(java_handle_bytearray_t* value);
+       void set_declaredAnnotations (java_handle_t* value);
+       void set_cons                (java_handle_t* value);
 
        // Convenience functions.
-       inline methodinfo* get_method();
+       methodinfo* get_method();
 };
 
 
-inline java_lang_reflect_VMConstructor::java_lang_reflect_VMConstructor(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_VMConstructor((java_handle_t*) h);
-}
-
 inline java_lang_reflect_VMConstructor::java_lang_reflect_VMConstructor(methodinfo* m)
 {
        _handle = builtin_new(class_java_lang_reflect_VMConstructor);
@@ -1085,29 +1150,23 @@ private:
 
 public:
        java_lang_reflect_Constructor(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Constructor(jobject h);
        java_lang_reflect_Constructor(methodinfo* m);
 
        java_handle_t* new_instance(java_handle_objectarray_t* args);
 
        // Getters.
-       inline int32_t        get_flag() const;
-       inline java_handle_t* get_cons() const;
+       int32_t        get_flag() const;
+       java_handle_t* get_cons() const;
 
        // Setters.
-       inline void set_cons(java_handle_t* value);
+       void set_cons(java_handle_t* value);
 
        // Convenience functions.
-       inline methodinfo* get_method  () const;
-       inline int32_t     get_override() const;
+       methodinfo* get_method  () const;
+       int32_t     get_override() const;
 };
 
 
-inline java_lang_reflect_Constructor::java_lang_reflect_Constructor(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Constructor((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Constructor::java_lang_reflect_Constructor(methodinfo* m)
 {
        java_lang_reflect_VMConstructor jlrvmc(m);
@@ -1181,34 +1240,28 @@ private:
 
 public:
        java_lang_reflect_VMField(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_VMField(jobject h);
        java_lang_reflect_VMField(fieldinfo* f);
 
        // Getters.
-       inline classinfo*               get_clazz              () const;
-       inline int32_t                  get_slot               () const;
-       inline java_handle_bytearray_t* get_annotations        () const;
-       inline java_handle_t*           get_declaredAnnotations() const;
-       inline java_handle_t*           get_f                  () const;
+       classinfo*               get_clazz              () const;
+       int32_t                  get_slot               () const;
+       java_handle_bytearray_t* get_annotations        () const;
+       java_handle_t*           get_declaredAnnotations() const;
+       java_handle_t*           get_f                  () const;
 
        // Setters.
-       inline void set_clazz              (classinfo* value);
-       inline void set_name               (java_handle_t* value);
-       inline void set_slot               (int32_t value);
-       inline void set_annotations        (java_handle_bytearray_t* value);
-       inline void set_declaredAnnotations(java_handle_t* value);
-       inline void set_f                  (java_handle_t* value);
+       void set_clazz              (classinfo* value);
+       void set_name               (java_handle_t* value);
+       void set_slot               (int32_t value);
+       void set_annotations        (java_handle_bytearray_t* value);
+       void set_declaredAnnotations(java_handle_t* value);
+       void set_f                  (java_handle_t* value);
 
        // Convenience functions.
-       inline fieldinfo* get_field() const;
+       fieldinfo* get_field() const;
 };
 
 
-inline java_lang_reflect_VMField::java_lang_reflect_VMField(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_VMField((java_handle_t*) h);
-}
-
 inline java_lang_reflect_VMField::java_lang_reflect_VMField(fieldinfo* f)
 {
        _handle = builtin_new(class_java_lang_reflect_VMField);
@@ -1312,26 +1365,20 @@ private:
 
 public:
        java_lang_reflect_Field(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Field(jobject h);
        java_lang_reflect_Field(fieldinfo* f);
 
        // Getters.
-       inline int32_t        get_flag() const;
-       inline java_handle_t* get_f() const;
+       int32_t        get_flag() const;
+       java_handle_t* get_f() const;
 
        // Setters.
-       inline void set_f(java_handle_t* value);
+       void set_f(java_handle_t* value);
 
        // Convenience functions.
-       inline fieldinfo* get_field() const;
+       fieldinfo* get_field() const;
 };
 
 
-inline java_lang_reflect_Field::java_lang_reflect_Field(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Field((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Field::java_lang_reflect_Field(fieldinfo* f)
 {
        java_lang_reflect_VMField jlrvmf(f);
@@ -1404,36 +1451,31 @@ private:
 
 public:
        java_lang_reflect_VMMethod(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_VMMethod(jobject h);
        java_lang_reflect_VMMethod(methodinfo* m);
 
        // Getters.
-       inline classinfo*               get_clazz               () const;
-       inline int32_t                  get_slot                () const;
-       inline java_handle_bytearray_t* get_annotations         () const;
-       inline java_handle_bytearray_t* get_parameterAnnotations() const;
-       inline java_handle_bytearray_t* get_annotationDefault   () const;
-       inline java_handle_t*           get_declaredAnnotations () const;
-       inline java_handle_t*           get_m                   () const;
+       classinfo*               get_clazz               () const;
+       int32_t                  get_slot                () const;
+       java_handle_bytearray_t* get_annotations         () const;
+       java_handle_bytearray_t* get_parameterAnnotations() const;
+       java_handle_bytearray_t* get_annotationDefault   () const;
+       java_handle_t*           get_declaredAnnotations () const;
+       java_handle_t*           get_m                   () const;
 
        // Setters.
-       inline void set_clazz               (classinfo* value);
-       inline void set_name                (java_handle_t* value);
-       inline void set_slot                (int32_t value);
-       inline void set_annotations         (java_handle_bytearray_t* value);
-       inline void set_parameterAnnotations(java_handle_bytearray_t* value);
-       inline void set_annotationDefault   (java_handle_bytearray_t* value);
-       inline void set_declaredAnnotations (java_handle_t* value);
-       inline void set_m                   (java_handle_t* value);
+       void set_clazz               (classinfo* value);
+       void set_name                (java_handle_t* value);
+       void set_slot                (int32_t value);
+       void set_annotations         (java_handle_bytearray_t* value);
+       void set_parameterAnnotations(java_handle_bytearray_t* value);
+       void set_annotationDefault   (java_handle_bytearray_t* value);
+       void set_declaredAnnotations (java_handle_t* value);
+       void set_m                   (java_handle_t* value);
 
        // Convenience functions.
-       inline methodinfo* get_method() const;
+       methodinfo* get_method() const;
 };
 
-inline java_lang_reflect_VMMethod::java_lang_reflect_VMMethod(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_VMMethod((java_handle_t*) h);
-}
 
 inline java_lang_reflect_VMMethod::java_lang_reflect_VMMethod(methodinfo* m)
 {
@@ -1560,29 +1602,23 @@ private:
 
 public:
        java_lang_reflect_Method(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Method(jobject h);
        java_lang_reflect_Method(methodinfo* m);
 
        java_handle_t* invoke(java_handle_t* o, java_handle_objectarray_t* args);
 
        // Getters.
-       inline int32_t        get_flag() const;
-       inline java_handle_t* get_m() const;
+       int32_t        get_flag() const;
+       java_handle_t* get_m() const;
 
        // Setters.
-       inline void set_m(java_handle_t* value);
+       void set_m(java_handle_t* value);
 
        // Convenience functions.
-       inline methodinfo* get_method  () const;
-       inline int32_t     get_override() const;
+       methodinfo* get_method  () const;
+       int32_t     get_override() const;
 };
 
 
-inline java_lang_reflect_Method::java_lang_reflect_Method(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Method((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Method::java_lang_reflect_Method(methodinfo* m)
 {
        java_lang_reflect_VMMethod jlrvmm(m);
@@ -1656,7 +1692,7 @@ public:
        java_nio_Buffer(java_handle_t* h) : java_lang_Object(h) {}
 
        // Getters.
-       inline int32_t get_cap() const;
+       int32_t get_cap() const;
 };
 
 inline int32_t java_nio_Buffer::get_cap() const
@@ -1697,16 +1733,11 @@ private:
 
 public:
        java_nio_DirectByteBufferImpl(java_handle_t* h) : java_lang_Object(h) {}
-       java_nio_DirectByteBufferImpl(jobject h);
 
        // Getters.
-       inline java_handle_t* get_address() const;
+       java_handle_t* get_address() const;
 };
 
-inline java_nio_DirectByteBufferImpl::java_nio_DirectByteBufferImpl(jobject h) : java_lang_Object(h)
-{
-       java_nio_DirectByteBufferImpl((java_handle_t*) h);
-}
 
 inline java_handle_t* java_nio_DirectByteBufferImpl::get_address() const
 {
@@ -1736,11 +1767,11 @@ public:
        gnu_classpath_Pointer(java_handle_t* h) : java_lang_Object(h) {}
        gnu_classpath_Pointer(java_handle_t* h, void* data);
 
-       // Setters.
-       inline void* get_data() const;
+       // Getters.
+       void* get_data() const;
 
        // Setters.
-       inline void set_data(void* value);
+       void set_data(void* value);
 };
 
 inline gnu_classpath_Pointer::gnu_classpath_Pointer(java_handle_t* h, void* data) : java_lang_Object(h)
@@ -1809,6 +1840,39 @@ inline java_lang_AssertionStatusDirectives::java_lang_AssertionStatusDirectives(
 }
 
 
+/**
+ * OpenJDK java/lang/ClassLoader
+ *
+ * Object layout:
+ *
+ * 0. object header
+ * 1. boolean               initialized
+ * 2. java.lang.ClassLoader parent
+ * [other fields are not used]
+ */
+class java_lang_ClassLoader : public java_lang_Object, private FieldAccess {
+private:
+       // Static offsets of the object's instance fields.
+       // TODO These offsets need to be checked on VM startup.
+       static const off_t offset_initialized = MEMORY_ALIGN(sizeof(java_object_t),                sizeof(int32_t));
+       static const off_t offset_parent      = MEMORY_ALIGN(offset_initialized + sizeof(int32_t), SIZEOF_VOID_P);
+
+public:
+       java_lang_ClassLoader(java_handle_t* h) : java_lang_Object(h) {}
+
+       // Getters.
+       java_handle_t* get_parent() const;
+
+       // Invocation wrappers for static methods.
+       static java_handle_t* invoke_getSystemClassLoader();
+};
+
+inline java_handle_t* java_lang_ClassLoader::get_parent() const
+{
+       return get<java_handle_t*>(_handle, offset_parent);
+}
+
+
 /**
  * OpenJDK java/lang/StackTraceElement
  *
@@ -1870,25 +1934,19 @@ private:
 
 public:
        java_lang_String(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_String(jstring h);
        java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset = 0);
 
        // Getters.
-       inline java_handle_chararray_t* get_value () const;
-       inline int32_t                  get_offset() const;
-       inline int32_t                  get_count () const;
+       java_handle_chararray_t* get_value () const;
+       int32_t                  get_offset() const;
+       int32_t                  get_count () const;
 
        // Setters.
-       inline void set_value (java_handle_chararray_t* value);
-       inline void set_offset(int32_t value);
-       inline void set_count (int32_t value);
+       void set_value (java_handle_chararray_t* value);
+       void set_offset(int32_t value);
+       void set_count (int32_t value);
 };
 
-inline java_lang_String::java_lang_String(jstring h) : java_lang_Object(h)
-{
-       java_lang_String((java_handle_t*) h);
-}
-
 inline java_lang_String::java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset) : java_lang_Object(h)
 {
        set_value(value);
@@ -1990,14 +2048,15 @@ public:
 //     java_lang_Thread(threadobject* t);
 
        // Getters.
-       inline int32_t        get_priority                () const;
-       inline int32_t        get_daemon                  () const;
-       inline java_handle_t* get_group                   () const;
-       inline java_handle_t* get_uncaughtExceptionHandler() const;
+       int32_t        get_priority                () const;
+       int32_t        get_daemon                  () const;
+       java_handle_t* get_group                   () const;
+       java_handle_t* get_uncaughtExceptionHandler() const;
 
        // Setters.
-       inline void set_priority(int32_t value);
-       inline void set_group   (java_handle_t* value);
+       void set_priority    (int32_t value);
+       void set_group       (java_handle_t* value);
+       void set_threadStatus(int32_t value);
 };
 
 
@@ -2032,6 +2091,11 @@ inline void java_lang_Thread::set_group(java_handle_t* value)
        set(_handle, offset_group, value);
 }
 
+inline void java_lang_Thread::set_threadStatus(int32_t value)
+{
+       set(_handle, offset_threadStatus, value);
+}
+
 
 
 /**
@@ -2056,27 +2120,20 @@ private:
 
 public:
        java_lang_Throwable(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_Throwable(jobject h);
-       java_lang_Throwable(jobject h, java_handle_bytearray_t* backtrace);
+       java_lang_Throwable(java_handle_t* h, java_handle_bytearray_t* backtrace);
 
        // Getters.
-       inline java_handle_bytearray_t* get_backtrace    () const;
-       inline java_handle_t*           get_detailMessage() const;
-       inline java_handle_t*           get_cause        () const;
+       java_handle_bytearray_t* get_backtrace    () const;
+       java_handle_t*           get_detailMessage() const;
+       java_handle_t*           get_cause        () const;
 
        // Setters.
-       inline void set_backtrace(java_handle_bytearray_t* value);
+       void set_backtrace(java_handle_bytearray_t* value);
 };
 
 
-inline java_lang_Throwable::java_lang_Throwable(jobject h) : java_lang_Object(h)
+inline java_lang_Throwable::java_lang_Throwable(java_handle_t* h, java_handle_bytearray_t* backtrace) : java_lang_Object(h)
 {
-       java_lang_Throwable((java_handle_t*) h);
-}
-
-inline java_lang_Throwable::java_lang_Throwable(jobject h, java_handle_bytearray_t* backtrace) : java_lang_Object(h)
-{
-       java_lang_Throwable((java_handle_t*) h);
        set_backtrace(backtrace);
 }
 
@@ -2145,37 +2202,31 @@ private:
 
 public:
        java_lang_reflect_Constructor(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Constructor(jobject h);
        java_lang_reflect_Constructor(methodinfo* m);
 
        java_handle_t* new_instance(java_handle_objectarray_t* args);
 
        // Getters.
-       inline int32_t                  get_override   () const;
-       inline classinfo*               get_clazz      () const;
-       inline int32_t                  get_slot       () const;
-       inline java_handle_bytearray_t* get_annotations() const;
+       int32_t                  get_override   () const;
+       classinfo*               get_clazz      () const;
+       int32_t                  get_slot       () const;
+       java_handle_bytearray_t* get_annotations() const;
 
        // Setters.
-       inline void set_clazz               (classinfo* value);
-       inline void set_slot                (int32_t value);
-       inline void set_parameterTypes      (java_handle_objectarray_t* value);
-       inline void set_exceptionTypes      (java_handle_objectarray_t* value);
-       inline void set_modifiers           (int32_t value);
-       inline void set_signature           (java_handle_t* value);
-       inline void set_annotations         (java_handle_bytearray_t* value);
-       inline void set_parameterAnnotations(java_handle_bytearray_t* value);
+       void set_clazz               (classinfo* value);
+       void set_slot                (int32_t value);
+       void set_parameterTypes      (java_handle_objectarray_t* value);
+       void set_exceptionTypes      (java_handle_objectarray_t* value);
+       void set_modifiers           (int32_t value);
+       void set_signature           (java_handle_t* value);
+       void set_annotations         (java_handle_bytearray_t* value);
+       void set_parameterAnnotations(java_handle_bytearray_t* value);
 
        // Convenience functions.
-       inline methodinfo* get_method();
+       methodinfo* get_method();
 };
 
 
-inline java_lang_reflect_Constructor::java_lang_reflect_Constructor(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Constructor((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Constructor::java_lang_reflect_Constructor(methodinfo* m)
 {
        _handle = builtin_new(class_java_lang_reflect_Constructor);
@@ -2315,34 +2366,28 @@ private:
 
 public:
        java_lang_reflect_Field(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Field(jobject h);
        java_lang_reflect_Field(fieldinfo* f);
 
        // Getters.
-       inline int32_t                  get_override   () const;
-       inline classinfo*               get_clazz      () const;
-       inline int32_t                  get_slot       () const;
-       inline java_handle_bytearray_t* get_annotations() const;
+       int32_t                  get_override   () const;
+       classinfo*               get_clazz      () const;
+       int32_t                  get_slot       () const;
+       java_handle_bytearray_t* get_annotations() const;
 
        // Setters.
-       inline void set_clazz      (classinfo* value);
-       inline void set_slot       (int32_t value);
-       inline void set_name       (java_handle_t* value);
-       inline void set_type       (classinfo* value);
-       inline void set_modifiers  (int32_t value);
-       inline void set_signature  (java_handle_t* value);
-       inline void set_annotations(java_handle_bytearray_t* value);
+       void set_clazz      (classinfo* value);
+       void set_slot       (int32_t value);
+       void set_name       (java_handle_t* value);
+       void set_type       (classinfo* value);
+       void set_modifiers  (int32_t value);
+       void set_signature  (java_handle_t* value);
+       void set_annotations(java_handle_bytearray_t* value);
 
        // Convenience functions.
-       inline fieldinfo* get_field() const;
+       fieldinfo* get_field() const;
 };
 
 
-inline java_lang_reflect_Field::java_lang_reflect_Field(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Field((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Field::java_lang_reflect_Field(fieldinfo* f)
 {
        _handle = builtin_new(class_java_lang_reflect_Field);
@@ -2477,31 +2522,25 @@ private:
 
 public:
        java_lang_reflect_Method(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_reflect_Method(jobject h);
        java_lang_reflect_Method(methodinfo* m);
 
        java_handle_t* invoke(java_handle_t* o, java_handle_objectarray_t* args);
 
        // Getters.
-       inline int32_t                  get_override            () const;
-       inline classinfo*               get_clazz               () const;
-       inline int32_t                  get_slot                () const;
-       inline java_handle_bytearray_t* get_annotations         () const;
-       inline java_handle_bytearray_t* get_parameterAnnotations() const;
-       inline java_handle_bytearray_t* get_annotationDefault   () const;
+       int32_t                  get_override            () const;
+       classinfo*               get_clazz               () const;
+       int32_t                  get_slot                () const;
+       java_handle_bytearray_t* get_annotations         () const;
+       java_handle_bytearray_t* get_parameterAnnotations() const;
+       java_handle_bytearray_t* get_annotationDefault   () const;
 
        // Setters.
 
        // Convenience functions.
-       inline methodinfo* get_method() const;
+       methodinfo* get_method() const;
 };
 
 
-inline java_lang_reflect_Method::java_lang_reflect_Method(jobject h) : java_lang_Object(h)
-{
-       java_lang_reflect_Method((java_handle_t*) h);
-}
-
 inline java_lang_reflect_Method::java_lang_reflect_Method(methodinfo* m)
 {
        _handle = builtin_new(class_java_lang_reflect_Method);
@@ -2587,10 +2626,9 @@ private:
 
 public:
        java_nio_Buffer(java_handle_t* h) : java_lang_Object(h) {}
-       java_nio_Buffer(jobject h) : java_lang_Object(h) {}
 
        // Getters.
-       inline void* get_address() const;
+       void* get_address() const;
 };
 
 
@@ -2624,27 +2662,21 @@ private:
 
 public:
        com_sun_cldchi_jvm_FileDescriptor(java_handle_t* h) : java_lang_Object(h) {}
-       com_sun_cldchi_jvm_FileDescriptor(jobject h);
        com_sun_cldchi_jvm_FileDescriptor(java_handle_t* h, int64_t pointer, int32_t position, int32_t length);
        com_sun_cldchi_jvm_FileDescriptor(java_handle_t* h, com_sun_cldchi_jvm_FileDescriptor& fd);
 
        // Getters.
-       inline int64_t get_pointer () const;
-       inline int32_t get_position() const;
-       inline int32_t get_length  () const;
+       int64_t get_pointer () const;
+       int32_t get_position() const;
+       int32_t get_length  () const;
 
        // Setters.
-       inline void set_pointer (int64_t value);
-       inline void set_position(int32_t value);
-       inline void set_length  (int32_t value);
+       void set_pointer (int64_t value);
+       void set_position(int32_t value);
+       void set_length  (int32_t value);
 };
 
 
-inline com_sun_cldchi_jvm_FileDescriptor::com_sun_cldchi_jvm_FileDescriptor(jobject h) : java_lang_Object(h)
-{
-       com_sun_cldchi_jvm_FileDescriptor((java_handle_t*) h);
-}
-
 inline com_sun_cldchi_jvm_FileDescriptor::com_sun_cldchi_jvm_FileDescriptor(java_handle_t* h, int64_t pointer, int32_t position, int32_t length) : java_lang_Object(h)
 {
        set_pointer(pointer);
@@ -2710,24 +2742,19 @@ private:
 
 public:
        java_lang_String(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_String(jstring h);
        java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset = 0);
 
        // Getters.
-       inline java_handle_chararray_t* get_value () const;
-       inline int32_t                  get_offset() const;
-       inline int32_t                  get_count () const;
+       java_handle_chararray_t* get_value () const;
+       int32_t                  get_offset() const;
+       int32_t                  get_count () const;
 
        // Setters.
-       inline void set_value (java_handle_chararray_t* value);
-       inline void set_offset(int32_t value);
-       inline void set_count (int32_t value);
+       void set_value (java_handle_chararray_t* value);
+       void set_offset(int32_t value);
+       void set_count (int32_t value);
 };
 
-inline java_lang_String::java_lang_String(jstring h) : java_lang_Object(h)
-{
-       java_lang_String((java_handle_t*) h);
-}
 
 inline java_lang_String::java_lang_String(java_handle_t* h, java_handle_chararray_t* value, int32_t count, int32_t offset) : java_lang_Object(h)
 {
@@ -2793,24 +2820,18 @@ private:
 
 public:
        java_lang_Thread(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_Thread(jobject h);
 //     java_lang_Thread(threadobject* t);
 
        // Getters.
-       inline int32_t                  get_priority () const;
-       inline threadobject*            get_vm_thread() const;
-       inline java_handle_chararray_t* get_name     () const;
+       int32_t                  get_priority () const;
+       threadobject*            get_vm_thread() const;
+       java_handle_chararray_t* get_name     () const;
 
        // Setters.
-       inline void set_vm_thread(threadobject* value);
+       void set_vm_thread(threadobject* value);
 };
 
 
-inline java_lang_Thread::java_lang_Thread(jobject h) : java_lang_Object(h)
-{
-       java_lang_Thread((java_handle_t*) h);
-}
-
 // inline java_lang_Thread::java_lang_Thread(threadobject* t) : java_lang_Object(h)
 // {
 //     java_lang_Thread(thread_get_object(t));
@@ -2857,23 +2878,16 @@ private:
 
 public:
        java_lang_Throwable(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_Throwable(jobject h);
 
        // Getters.
-       inline java_handle_t*           get_detailMessage() const;
-       inline java_handle_bytearray_t* get_backtrace    () const;
+       java_handle_t*           get_detailMessage() const;
+       java_handle_bytearray_t* get_backtrace    () const;
 
        // Setters.
-       inline void set_backtrace(java_handle_bytearray_t* value);
+       void set_backtrace(java_handle_bytearray_t* value);
 };
 
 
-inline java_lang_Throwable::java_lang_Throwable(jobject h) : java_lang_Object(h)
-{
-       java_lang_Throwable((java_handle_t*) h);
-}
-
-
 inline java_handle_t* java_lang_Throwable::get_detailMessage() const
 {
        return get<java_handle_t*>(_handle, offset_detailMessage);
@@ -2892,13 +2906,6 @@ inline void java_lang_Throwable::set_backtrace(java_handle_bytearray_t* value)
 
 #endif // WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1
 
-#else
-
-// Legacy C interface.
-java_handle_t* java_lang_reflect_Constructor_create(methodinfo* m);
-java_handle_t* java_lang_reflect_Field_create(fieldinfo* f);
-java_handle_t* java_lang_reflect_Method_create(methodinfo* m);
-
 #endif
 
 #endif // _JAVAOBJECTS_HPP
@@ -2915,4 +2922,5 @@ java_handle_t* java_lang_reflect_Method_create(methodinfo* m);
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */