* tests/regression/jasmin/test_verify_ok_local_as_retaddr_and_reference.j:
authoredwin <none@none>
Wed, 28 Feb 2007 22:50:28 +0000 (22:50 +0000)
committeredwin <none@none>
Wed, 28 Feb 2007 22:50:28 +0000 (22:50 +0000)
New test.
* tests/regression/jasmin/Makefile.am: Added new test.

tests/regression/jasmin/Makefile.am
tests/regression/jasmin/test_verify_ok_local_as_retaddr_and_reference.j [new file with mode: 0644]

index 25e7be3ed72284998edaa4b1aa9c3a29772e538c..9582aafcd7c6a68b0cc43039c9ee13145ee9b292 100644 (file)
@@ -124,6 +124,7 @@ JASMIN_TESTS = \
        $(srcdir)/test_verify_ok_jsr_subroutine_loops_to_start.j \
        $(srcdir)/test_verify_ok_jsr_swap.j \
        $(srcdir)/test_verify_ok_jsr_through_variable.j \
+       $(srcdir)/test_verify_ok_local_as_retaddr_and_reference.j \
        $(srcdir)/test_verify_ok_overwrite_local_type.j \
        $(srcdir)/test_verify_ok_untyped_local.j \
        $(srcdir)/test_verify_unspecced_ok_backward_with_new_in_local.j \
diff --git a/tests/regression/jasmin/test_verify_ok_local_as_retaddr_and_reference.j b/tests/regression/jasmin/test_verify_ok_local_as_retaddr_and_reference.j
new file mode 100644 (file)
index 0000000..5e42c67
--- /dev/null
@@ -0,0 +1,91 @@
+.class public test_verify_ok_local_as_retaddr_and_reference
+.super java/lang/Object
+
+; ======================================================================
+
+.method public <init>()V
+   aload_0
+   invokenonvirtual java/lang/Object/<init>()V
+   return
+.end method
+
+; ======================================================================
+
+.method public static check(I)V
+       .limit locals 1
+       .limit stack 10
+       getstatic java/lang/System/out Ljava/io/PrintStream;
+       iload_0
+       invokevirtual java/io/PrintStream/println(I)V
+       return
+.end method
+
+; ======================================================================
+
+.method public static main([Ljava/lang/String;)V
+       .limit stack 2
+       .limit locals 3
+
+       ldc 35
+       istore 1
+
+       ; --------------------------------------------------
+
+       ; load local 2 with a reference to a string
+    ldc "foo"
+       astore 2
+
+       ; perform some bogus instructions
+       aload 0
+       ifnull branch_a
+
+       nop
+branch_a:
+
+    ; use the string in local 2
+       getstatic java/lang/System/out Ljava/io/PrintStream;
+       aload_2
+       invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
+       ; OUTPUT: foo
+
+       ; --------------------------------------------------
+
+       aload 0
+       ifnull branch_b
+
+       jsr sbr_1
+       goto merge_point
+       ; OUTPUT: 35
+
+branch_b:
+       jsr sbr_2
+       goto merge_point
+
+merge_point:
+    ; here local 2 becomes VOID, as two incompatible returnAddresses
+       ; are merged
+
+       ; --------------------------------------------------
+
+force_basic_block_boundary:
+
+       iload 1
+       invokestatic test_verify_ok_local_as_retaddr_and_reference/check(I)V
+       ; OUTPUT: 35
+
+       return
+
+sbr_1:
+       astore 2
+       iload 1
+       invokestatic test_verify_ok_local_as_retaddr_and_reference/check(I)V
+       ret 2
+
+sbr_2:
+       astore 2
+       ldc 42
+       invokestatic test_verify_ok_local_as_retaddr_and_reference/check(I)V
+       ret 2
+
+.end method
+