We shouldn't try to initialize classes with the compilation_unit mutex
held. The right fix here is to split initialization from fix-up, and do
the initialization before we even try to compile the method.

Reported-by: Tomek Grabiec <tgrab...@gmail.com>
Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 arch/x86/emit-code.c |   14 +++++++-------
 include/vm/static.h  |    2 +-
 jit/trampoline.c     |    6 ++++++
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/arch/x86/emit-code.c b/arch/x86/emit-code.c
index 0debd5a..ffa491d 100644
--- a/arch/x86/emit-code.c
+++ b/arch/x86/emit-code.c
@@ -416,13 +416,10 @@ static void fixup_vtable(struct compilation_unit *cu,
        vmc->vtable.native_ptr[cu->method->virtual_index] = target;
 }
 
-int fixup_static(struct vm_class *vmc)
+void fixup_static(struct vm_class *vmc)
 {
        struct static_fixup_site *this, *next;
 
-       if (vm_class_ensure_init(vmc))
-               return -1;
-
        list_for_each_entry_safe(this, next,
                &vmc->static_fixup_site_list, vmc_node)
        {
@@ -437,8 +434,6 @@ int fixup_static(struct vm_class *vmc)
                list_del(&this->cu_node);
                free(this);
        }
-
-       return 0;
 }
 
 int fixup_static_at(unsigned long addr)
@@ -455,7 +450,12 @@ int fixup_static_at(unsigned long addr)
                        + this->insn->mach_offset;
 
                if ((unsigned long) site_addr == addr) {
-                       return fixup_static(this->vmf->class);
+                       int ret = vm_class_ensure_init(this->vmf->class);
+                       if (ret)
+                               return ret;
+
+                       fixup_static(this->vmf->class);
+                       return 0;
                }
        }
 
diff --git a/include/vm/static.h b/include/vm/static.h
index e7e6104..6e434e0 100644
--- a/include/vm/static.h
+++ b/include/vm/static.h
@@ -28,7 +28,7 @@ int add_getstatic_fixup_site(struct insn *insn,
 int add_putstatic_fixup_site(struct insn *insn,
        struct vm_field *vmf, struct compilation_unit *cu);
 
-int fixup_static(struct vm_class *vmc);
+void fixup_static(struct vm_class *vmc);
 int fixup_static_at(unsigned long addr);
 
 extern unsigned long static_field_signal_bh(unsigned long ret);
diff --git a/jit/trampoline.c b/jit/trampoline.c
index dd9658a..40f3211 100644
--- a/jit/trampoline.c
+++ b/jit/trampoline.c
@@ -103,6 +103,12 @@ void *jit_magic_trampoline(struct compilation_unit *cu)
        struct vm_method *method = cu->method;
        void *ret;
 
+       if (vm_method_is_static(method)) {
+               /* This is for "invokestatic"... */
+               if (vm_class_ensure_init(method->class))
+                       return NULL;
+       }
+
        if (opt_trace_magic_trampoline)
                trace_magic_trampoline(cu);
 
-- 
1.6.0.4


------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have 
the opportunity to enter the BlackBerry Developer Challenge. See full prize 
details at: http://p.sf.net/sfu/blackberry
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to