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