This fixes problems encountered with passing arguments in case of JNI.

Signed-off-by: Eduard - Gabriel Munteanu <eduard.munte...@linux360.ro>
---
 arch/x86/args.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/x86/args.c b/arch/x86/args.c
index c52f3cd..5b5a740 100644
--- a/arch/x86/args.c
+++ b/arch/x86/args.c
@@ -42,15 +42,19 @@ int args_init(unsigned long *state,
        char *type;
 
        for (type = method->type; *type != ')'; type++) {
-               if (*type == 'I' || *type == 'L') {
-                       method->args_count--;
+               if (*type == 'I' || *type == 'L' || *type == 'J')
                        method->reg_args_count++;
-               }
 
                if (method->reg_args_count == 6)
                        break;
        }
 
+       if (vm_method_is_jni(method))
+               method->reg_args_count += 2;
+
+       method->reg_args_count = min(method->reg_args_count, 6);
+       method->args_count -= method->reg_args_count;
+
        *state = 1;
 
        return 0;
@@ -69,7 +73,9 @@ int args_set(unsigned long *state,
                return 0;
        }
 
-       assert((value_expr->vm_type == J_INT || value_expr->vm_type == J_LONG));
+       assert((value_expr->vm_type == J_INT ||
+               value_expr->vm_type == J_LONG ||
+               value_expr->vm_type == J_REFERENCE));
 
        reg = (6 - method->reg_args_count) + (*state)++ - method->args_count;
        expr->arg_private = (void *) reg;
-- 
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