Signed-off-by: Tomek Grabiec <[email protected]>
---
arch/x86/insn-selector_32.brg | 1 -
regression/jvm/ExceptionsTest.java | 32 ++++++++++++++++++++++++-
vm/class.c | 45 +++++++++++++++++++++++++++++++++--
3 files changed, 73 insertions(+), 5 deletions(-)
diff --git a/arch/x86/insn-selector_32.brg b/arch/x86/insn-selector_32.brg
index b3995ff..f900515 100644
--- a/arch/x86/insn-selector_32.brg
+++ b/arch/x86/insn-selector_32.brg
@@ -1247,7 +1247,6 @@ stmt: STMT_CHECKCAST(reg)
select_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned
long)check_cast));
method_args_cleanup(s, tree, 2);
- select_exception_test(s, tree);
}
%%
diff --git a/regression/jvm/ExceptionsTest.java
b/regression/jvm/ExceptionsTest.java
index 60a119b..b13d8bf 100644
--- a/regression/jvm/ExceptionsTest.java
+++ b/regression/jvm/ExceptionsTest.java
@@ -44,6 +44,9 @@ public class ExceptionsTest extends TestCase {
public static void takeLong(long val) {
}
+ public static void takeObject(Object obj) {
+ }
+
public static void testTryBlockDoesNotThrowAnything() {
boolean caught;
try {
@@ -309,6 +312,32 @@ public class ExceptionsTest extends TestCase {
assertTrue(caught);
}
+ public static void testCheckcast() {
+ boolean caught = false;
+ Object o = null;
+ String s = null;
+
+ try {
+ s = (String)o;
+ } catch (ClassCastException e) {
+ caught = true;
+ }
+
+ assertFalse(caught);
+
+ o = new Object();
+
+ try {
+ s = (String)o;
+ } catch (ClassCastException e) {
+ caught = true;
+ }
+
+ assertTrue(caught);
+
+ takeObject(s);
+ }
+
public static void main(String args[]) {
testTryBlockDoesNotThrowAnything();
testThrowAndCatchInTheSameMethod();
@@ -326,11 +355,12 @@ public class ExceptionsTest extends TestCase {
testGetfield();
testPutfield();
testMonitorenter();
- /* TODO: testMonitorexit() */
+ /* TODO: testMonitorexit() */
testIdiv();
testIrem();
testLdiv();
testLrem();
+ testCheckcast();
exit();
}
diff --git a/vm/class.c b/vm/class.c
index abb5620..c232b53 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -24,10 +24,13 @@
* Please refer to the file LICENSE for details.
*/
+#include <jit/exception.h>
#include <jit/compiler.h>
+#include <vm/string.h>
#include <vm/die.h>
#include <vm/vm.h>
#include <stdlib.h>
+#include <errno.h>
typedef void (*exception_init_fn)(struct object *, struct object *);
@@ -84,9 +87,45 @@ void check_array(struct object *obj, unsigned int index)
void check_cast(struct object *obj, struct object *type)
{
- if (!obj)
+ struct string *str;
+ int err;
+
+ if (!obj || isInstanceOf(type, obj->class))
return;
- if (!isInstanceOf(type, obj->class))
- abort();
+ if (exception_occurred())
+ goto throw;
+
+ str = alloc_str();
+ if (str == NULL) {
+ err = -ENOMEM;
+ goto error;
+ }
+
+ err = str_append(str, slash2dots(CLASS_CB(obj->class)->name));
+ if (err)
+ goto error;
+
+ err = str_append(str, " cannot be cast to ");
+ if (err)
+ goto error;
+
+ err = str_append(str, slash2dots(CLASS_CB(type)->name));
+ if (err)
+ goto error;
+
+ signal_new_exception("java/lang/ClassCastException", str->value);
+ free_str(str);
+ throw:
+ throw_from_jato_func(2 * sizeof(struct object *));
+ return;
+
+ error:
+ if (str)
+ free_str(str);
+
+ if (err == -ENOMEM) /* TODO: throw OutOfMemoryError */
+ die("%s: out of memory", __func__);
+
+ die("%s: error %d", __func__, err);
}
--
1.6.0.6
------------------------------------------------------------------------------
OpenSolaris 2009.06 is a cutting edge operating system for enterprises
looking to deploy the next generation of Solaris that includes the latest
innovations from Sun and the OpenSource community. Download a copy and
enjoy capabilities such as Networking, Storage and Virtualization.
Go to: http://p.sf.net/sfu/opensolaris-get
_______________________________________________
Jatovm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel