Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 arch/x86/insn-selector_32.brg |    7 ++++---
 vm/class.c                    |   15 ++++++++++++---
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/arch/x86/insn-selector_32.brg b/arch/x86/insn-selector_32.brg
index 6346454..9b918f6 100644
--- a/arch/x86/insn-selector_32.brg
+++ b/arch/x86/insn-selector_32.brg
@@ -834,7 +834,8 @@ reg:        EXPR_CLASS_FIELD 1
                 * don't want the fixup if we're already inside the
                 * initializer. */
                mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG,
-                       (unsigned long) vmc->static_values + vmf->offset, out);
+                       (unsigned long) vmc->static_values
+                               + vmf->static_offset, out);
        } else {
                mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG,
                        (unsigned long) static_guard_page, out);
@@ -848,8 +849,8 @@ reg:        EXPR_CLASS_FIELD 1
        if (expr->vm_type == J_LONG) {
                state->reg2 = get_var(s->b_parent);
                select_insn(s, tree, memdisp_reg_insn(INSN_MOV_MEMDISP_REG,
-                       (unsigned long) vmc->static_values + vmf->offset + 4,
-                       state->reg2));
+                       (unsigned long) vmc->static_values
+                               + vmf->static_offset + 4, state->reg2));
        }
 }
 
diff --git a/vm/class.c b/vm/class.c
index aecda8a..62d1a19 100644
--- a/vm/class.c
+++ b/vm/class.c
@@ -195,8 +195,7 @@ int vm_class_link(struct vm_class *vmc, const struct 
cafebabe_class *class)
                static_offset = 0;
        }
 
-       /* XXX: only static fields, right size, etc. */
-       vmc->static_values = malloc(static_offset + class->fields_count * 8);
+       unsigned int static_size = 0;
 
        for (uint16_t i = 0; i < class->fields_count; ++i) {
                struct vm_field *vmf = &vmc->fields[i];
@@ -206,6 +205,16 @@ int vm_class_link(struct vm_class *vmc, const struct 
cafebabe_class *class)
                        return -1;
                }
 
+               if (vm_field_is_static(vmf))
+                       static_size += 8;
+       }
+
+       /* XXX: only static fields, right size, etc. */
+       vmc->static_values = malloc(static_offset + static_size);
+
+       for (uint16_t i = 0; i < class->fields_count; ++i) {
+               struct vm_field *vmf = &vmc->fields[i];
+
                if (vm_field_is_static(vmf)) {
                        if (vm_field_init_static(vmf, static_offset)) {
                                NOT_IMPLEMENTED;
@@ -222,7 +231,7 @@ int vm_class_link(struct vm_class *vmc, const struct 
cafebabe_class *class)
        }
 
        vmc->object_size = offset;
-       vmc->static_size = static_offset;
+       vmc->static_size = static_offset + static_size;
 
        vmc->methods = malloc(sizeof(*vmc->methods) * class->methods_count);
        if (!vmc->methods) {
-- 
1.6.0.4


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

Reply via email to