We should return jint instead of jboolean in VM native implementations
because in the latter case only least significant byte is valid and
JIT code treats the native's return value as jint. This can cause that
even if native function returns false as jboolean, the JIT code might
see it as a jint value != 0. All java functions which return byte,
boolean, char and short push J_INT onto mimic stack (according to JVM
spec). To be ok with the specification and code we can do one of the
following:

   (1) add conversion code to JIT after native calls

   (2) set jint as a return value for all VM native functions
       returning types of size less than jint.

This patch provides solution nr (2).

This caused the following error to happen for clojure, because
native_vmthread_interrupted() returned != 0 even if
vm_thread_interrupted() returned false:

Exception in thread "main" java.lang.Exception: Transaction failed after 
reaching retry limit
   at clojure.lang.LockingTransaction.run(LockingTransaction.java:386)
   at 
clojure.lang.LockingTransaction.runInTransaction(LockingTransaction.java:236)
   at clojure.core$load_one__5814.invoke(core.clj:3731)
   at clojure.core$load_lib__5835.doInvoke(core.clj:3763)
   at clojure.lang.RestFn.applyTo(RestFn.java:147)
   at clojure.core$apply__3977.doInvoke(core.clj:402)
   at clojure.lang.RestFn.invoke(RestFn.java:443)
   at clojure.core$load_libs__5847.doInvoke(core.clj:3789)
   at clojure.lang.RestFn.applyTo(RestFn.java:142)
   at clojure.core$apply__3977.doInvoke(core.clj:402)
   at clojure.lang.RestFn.invoke(RestFn.java:443)
   at clojure.core$require__5853.doInvoke(core.clj:3857)
   at clojure.lang.RestFn.invoke(RestFn.java:413)
   at clojure.lang.Var.invoke(Var.java:359)
   at clojure.main.main(main.java:36)

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/runtime/class.h |    6 +++---
 runtime/class.c         |    6 +++---
 vm/jato.c               |    6 +++---
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/include/runtime/class.h b/include/runtime/class.h
index 50d1ec0..7691ac9 100644
--- a/include/runtime/class.h
+++ b/include/runtime/class.h
@@ -11,14 +11,14 @@ struct vm_object *native_vmclass_forname(struct vm_object 
*name,
                                         struct vm_object *loader);
 struct vm_object *native_vmclass_getname(struct vm_object *object);
 int32_t native_vmclass_is_anonymous_class(struct vm_object *object);
-jboolean native_vmclass_is_assignable_from(struct vm_object *clazz_1,
+jint native_vmclass_is_assignable_from(struct vm_object *clazz_1,
                                           struct vm_object *clazz_2);
 int32_t native_vmclass_isarray(struct vm_object *object);
 int32_t native_vmclass_isprimitive(struct vm_object *object);
 jint native_vmclass_getmodifiers(struct vm_object *clazz);
 struct vm_object *native_vmclass_getcomponenttype(struct vm_object *object);
-jboolean native_vmclass_isinstance(struct vm_object *clazz,
+jint native_vmclass_isinstance(struct vm_object *clazz,
                                   struct vm_object *object);
-jboolean native_vmclass_isinterface(struct vm_object *clazz);
+jint native_vmclass_isinterface(struct vm_object *clazz);
 
 #endif /* RUNTIME_CLASS_H */
diff --git a/runtime/class.c b/runtime/class.c
index 9fe690d..636ff11 100644
--- a/runtime/class.c
+++ b/runtime/class.c
@@ -108,7 +108,7 @@ int32_t native_vmclass_is_anonymous_class(struct vm_object 
*object)
        return vm_class_is_anonymous(class);
 }
 
-jboolean native_vmclass_is_assignable_from(struct vm_object *clazz_1,
+jint native_vmclass_is_assignable_from(struct vm_object *clazz_1,
                                           struct vm_object *clazz_2)
 {
        struct vm_class *vmc_1 = vm_object_to_vm_class(clazz_1);
@@ -164,7 +164,7 @@ struct vm_object *native_vmclass_getcomponenttype(struct 
vm_object *object)
        return vm_class_get_array_element_class(class)->object;
 }
 
-jboolean native_vmclass_isinstance(struct vm_object *clazz,
+jint native_vmclass_isinstance(struct vm_object *clazz,
                                   struct vm_object *object)
 {
        struct vm_class *class = vm_object_to_vm_class(clazz);
@@ -175,7 +175,7 @@ jboolean native_vmclass_isinstance(struct vm_object *clazz,
        return vm_class_is_assignable_from(class, object->class);
 }
 
-jboolean native_vmclass_isinterface(struct vm_object *clazz)
+jint native_vmclass_isinterface(struct vm_object *clazz)
 {
        struct vm_class *class = vm_object_to_vm_class(clazz);
        if (!class)
diff --git a/vm/jato.c b/vm/jato.c
index 9e1c9ac..73dca95 100644
--- a/vm/jato.c
+++ b/vm/jato.c
@@ -461,12 +461,12 @@ static void native_vmthread_start(struct vm_object 
*vmthread, jlong stacksize)
        vm_thread_start(vmthread);
 }
 
-static jboolean native_vmthread_interrupted(void)
+static jint native_vmthread_interrupted(void)
 {
        return vm_thread_interrupted(vm_thread_self());
 }
 
-static jboolean native_vmthread_isinterrupted(struct vm_object *vmthread)
+static jint native_vmthread_isinterrupted(struct vm_object *vmthread)
 {
        struct vm_thread *thread;
 
@@ -569,7 +569,7 @@ static struct vm_object *native_vmstring_intern(struct 
vm_object *str)
        return vm_string_intern(str);
 }
 
-static jboolean native_atomiclong_vm_supports_cs8(void)
+static jint native_atomiclong_vm_supports_cs8(void)
 {
        return false;
 }
-- 
1.6.0.4


------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to