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