* src/vm/classcache.cpp,
[cacao.git] / src / vm / javaobjects.hpp
index 4ecd9dd497e8f95ad24822050c3786081a928aa6..f53021823dc92506107df2aba9a4c5834c4520e8 100644 (file)
 
 #include "native/llni.h"
 
-#include "vm/class.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 +79,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;
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
-       GC::critical_enter();
+       java_object_t* ho = LLNI_UNWRAP(h);
+       raw_set(ho, offset, (volatile T) value);
 
-       // XXX This should be h->get_object();
-       o = LLNI_UNWRAP(h);
-
-       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,7 +197,6 @@ 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.
@@ -182,15 +212,12 @@ public:
 
 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
@@ -203,19 +230,12 @@ inline int32_t java_lang_Object::get_hashcode() const
 #if defined(ENABLE_GC_CACAO)
        return heap_get_hashcode(_handle);
 #else
-       java_object_t* o;
-       int32_t hashcode;
-
-       GC::critical_enter();
+       // This function is inside a critical section.
+       GCCriticalSection cs;
 
        // XXX This should be h->get_object();
-       o = LLNI_UNWRAP(_handle);
-
-       hashcode = (int32_t)(intptr_t) o;
-
-       GC::critical_leave();
-       
-       return hashcode;
+       java_object_t* o = LLNI_UNWRAP(_handle);
+       return (int32_t) (intptr_t) o;
 #endif
 }
 
@@ -562,7 +582,6 @@ public:
 
        // Setters.
        inline void set_pd(java_handle_t* value);
-       inline void set_pd(jobject value);
 };
 
 inline void java_lang_Class::set_pd(java_handle_t* value)
@@ -570,11 +589,6 @@ 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)
-{
-       set_pd((java_handle_t*) value);
-}
-
 
 /**
  * GNU Classpath java/lang/StackTraceElement
@@ -637,7 +651,6 @@ 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.
@@ -651,11 +664,6 @@ public:
        inline 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);
@@ -814,7 +822,6 @@ 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.
@@ -827,11 +834,6 @@ public:
 };
 
 
-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);
@@ -923,16 +925,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);
 };
 
-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
 {
@@ -971,7 +968,6 @@ 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.
@@ -995,11 +991,6 @@ public:
 };
 
 
-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);
@@ -1107,7 +1098,6 @@ 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);
@@ -1125,11 +1115,6 @@ public:
 };
 
 
-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);
@@ -1203,7 +1188,6 @@ 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.
@@ -1226,11 +1210,6 @@ public:
 };
 
 
-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);
@@ -1334,7 +1313,6 @@ 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.
@@ -1349,11 +1327,6 @@ public:
 };
 
 
-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);
@@ -1426,7 +1399,6 @@ 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.
@@ -1452,10 +1424,6 @@ public:
        inline 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)
 {
@@ -1582,7 +1550,6 @@ 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);
@@ -1600,11 +1567,6 @@ public:
 };
 
 
-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);
@@ -1719,16 +1681,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;
 };
 
-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
 {
@@ -1892,7 +1849,6 @@ 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.
@@ -1906,11 +1862,6 @@ public:
        inline 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);
@@ -2078,8 +2029,7 @@ 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;
@@ -2091,14 +2041,8 @@ public:
 };
 
 
-inline java_lang_Throwable::java_lang_Throwable(jobject h) : 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)
+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);
        set_backtrace(backtrace);
 }
 
@@ -2167,7 +2111,6 @@ 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);
@@ -2193,11 +2136,6 @@ public:
 };
 
 
-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);
@@ -2337,7 +2275,6 @@ 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.
@@ -2360,11 +2297,6 @@ public:
 };
 
 
-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);
@@ -2499,7 +2431,6 @@ 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);
@@ -2519,11 +2450,6 @@ public:
 };
 
 
-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);
@@ -2609,7 +2535,6 @@ 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;
@@ -2646,7 +2571,6 @@ 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);
 
@@ -2662,11 +2586,6 @@ public:
 };
 
 
-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);
@@ -2732,7 +2651,6 @@ 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.
@@ -2746,10 +2664,6 @@ public:
        inline 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)
 {
@@ -2815,7 +2729,6 @@ private:
 
 public:
        java_lang_Thread(java_handle_t* h) : java_lang_Object(h) {}
-       java_lang_Thread(jobject h);
 //     java_lang_Thread(threadobject* t);
 
        // Getters.
@@ -2828,11 +2741,6 @@ public:
 };
 
 
-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));
@@ -2879,7 +2787,6 @@ 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;
@@ -2890,12 +2797,6 @@ public:
 };
 
 
-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);
@@ -2914,13 +2815,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