According to §5.5 of the JVM Spec., 2nd. ed.:

"The execution of any one of the Java virtual machine instructions
new, getstatic, putstatic, or invokestatic that references the class
or interface."

So let's fix this.

Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 jit/invoke-bc.c |    5 +++++
 jit/object-bc.c |   12 ++++++++++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/jit/invoke-bc.c b/jit/invoke-bc.c
index aa08109..b01f2bc 100644
--- a/jit/invoke-bc.c
+++ b/jit/invoke-bc.c
@@ -182,6 +182,11 @@ int convert_invokestatic(struct parse_context *ctx)
        if (!invoke_target)
                return warn("unable to resolve invocation target"), -EINVAL;
 
+       /* JVM Spec. 2nd. ed., §5.5 */
+       err = vm_class_ensure_init(invoke_target->class);
+       if (err)
+               return err;
+
        expr = invoke_expr(invoke_target);
        if (!expr)
                return -ENOMEM;
diff --git a/jit/object-bc.c b/jit/object-bc.c
index a6a436f..13f42e9 100644
--- a/jit/object-bc.c
+++ b/jit/object-bc.c
@@ -68,11 +68,17 @@ int convert_getstatic(struct parse_context *ctx)
 {
        struct expression *value;
        struct vm_field *fb;
+       int err;
 
        fb = lookup_field(ctx);
        if (!fb)
                return warn("field lookup failed"), -EINVAL;
 
+       /* JVM Spec. 2nd. ed., §5.5 */
+       err = vm_class_ensure_init(fb->class);
+       if (err)
+               return err;
+
        value = class_field_expr(vm_field_type(fb), fb);
        if (!value)
                return -ENOMEM;
@@ -86,11 +92,17 @@ int convert_putstatic(struct parse_context *ctx)
        struct vm_field *fb;
        struct statement *store_stmt;
        struct expression *dest, *src;
+       int err;
 
        fb = lookup_field(ctx);
        if (!fb)
                return warn("field lookup failed"), -EINVAL;
 
+       /* JVM Spec. 2nd. ed., §5.5 */
+       err = vm_class_ensure_init(fb->class);
+       if (err)
+               return err;
+
        src = stack_pop(ctx->bb->mimic_stack);
        dest = class_field_expr(vm_field_type(fb), fb);
        if (!dest)
-- 
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