Those instructions are supposed to push J_INT value on mimic-stack.

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 jit/object-bc.c               |   10 +++++++++-
 regression/jvm/ArrayTest.java |   14 ++++++++++++++
 2 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/jit/object-bc.c b/jit/object-bc.c
index 0604e7c..b88423c 100644
--- a/jit/object-bc.c
+++ b/jit/object-bc.c
@@ -176,6 +176,8 @@ static int convert_array_load(struct parse_context *ctx, 
enum vm_type type)
        struct expression *arrayref_pure;
        struct expression *index_pure;
 
+       assert(type != J_BOOLEAN);
+
        index = stack_pop(ctx->bb->mimic_stack);
        arrayref = null_check_expr(stack_pop(ctx->bb->mimic_stack));
        if (!arrayref)
@@ -195,7 +197,13 @@ static int convert_array_load(struct parse_context *ctx, 
enum vm_type type)
        index_pure = get_pure_expr(ctx, index);
        src_expr = array_deref_expr(type, arrayref_pure, index_pure);
 
-       dest_expr = temporary_expr(type, ctx->cu);
+       /*
+        * baload, caload and saload should push int value on stack.
+        */
+       if (type == J_BYTE || type == J_CHAR || type == J_SHORT)
+               dest_expr = temporary_expr(J_INT, ctx->cu);
+       else
+               dest_expr = temporary_expr(type, ctx->cu);
 
        store_stmt->store_src = &src_expr->node;
        store_stmt->store_dest = &dest_expr->node;
diff --git a/regression/jvm/ArrayTest.java b/regression/jvm/ArrayTest.java
index 6c85ebc..f60a642 100644
--- a/regression/jvm/ArrayTest.java
+++ b/regression/jvm/ArrayTest.java
@@ -163,6 +163,19 @@ public class ArrayTest extends TestCase {
         assertTrue(arr2.getClass().equals(big_arr[0][0].getClass()));
     }
 
+    public static void testByteCharShortLoadPushesInt() {
+        char c[] = { 0 };
+        byte b[] = { 0 };
+        short s[] = { 0 };
+
+        // caload, baload, saload should push INT on stack. If
+        // they don't the following will trigger assertion
+        // failure in convert_truncation().
+        takeInt( (byte) c[0] );
+        takeInt( (char) b[0] );
+        takeInt( (byte) s[0] );
+    }
+
     public static void main(String args[]) {
         testEmptyStaticArrayLength();
         testEmptyArrayLength();
@@ -181,5 +194,6 @@ public class ArrayTest extends TestCase {
         testDoubleElementLoadStore();
 
         testArrayClass();
+        testByteCharShortLoadPushesInt();
     }
 }
-- 
1.6.0.6


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to