This fixes a bug in type_to_scale() where for element types less than
word size it returned 0 or 1 scale exponent. This caused that during
store to an array element the following elements were overwriten. This
caused that this code didn't work:

    {
        byte x[] = new byte[2];

        x[1] = 1;
        x[0] = 2;

        assertEquals(1, x[1]);
    }

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/insn-selector_32.brg |   28 +++++++++++-----------------
 1 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/arch/x86/insn-selector_32.brg b/arch/x86/insn-selector_32.brg
index 2d50ea6..6346454 100644
--- a/arch/x86/insn-selector_32.brg
+++ b/arch/x86/insn-selector_32.brg
@@ -51,25 +51,19 @@ static void select_exception_test(struct basic_block *bb,
 
 static unsigned char type_to_scale(enum vm_type vm_type)
 {
-       unsigned char scale;
-
-       switch (vm_type) {
-       case J_BYTE:
-       case J_CHAR:
-               scale = 0;
-               break;
-       case J_SHORT:
-               scale = 1;
-               break;
-       case J_INT:
-       case J_REFERENCE:
-               scale = 2;
-               break;
+       /* Currently we can store not less than machine word at once */
+       switch (get_vmtype_size(vm_type)) {
+       case 1:
+            return 0;
+       case 2:
+            return 1;
+       case 4:
+            return 2;
+       case 8:
+            return 3;
        default:
-               assert(!"Not supported yet");
+               error("Invalid type size");
        }
-
-       return scale;
 }
 
 static void method_args_cleanup(struct basic_block *bb, struct tree_node *tree,
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to