From 25e1af5b4e1ce7e03a188ca1d0197a9f5b6acaf8 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Thu, 9 Jul 2015 11:30:14 -0700 Subject: ART: Change merges with Undefined to Undefined The result of a merge with an Undefined type should be Undefined. Conflicts are allowed to be copied around, but Undefined registers should not be touched at all, except to be written into. Add a success test case (the register isn't used) and a fail test case (the register is tried to be copied). Bug: 22331663 Bug: 22371999 (cherry picked from commit 97a1ff353f254b6e46c7501fe3f0e3254c2517b4) Change-Id: I9697ce31c1d2ab5aee0433dcf1253bcca79c2983 --- test/800-smali/expected.txt | 2 ++ test/800-smali/smali/b_22331663_fail.smali | 20 ++++++++++++++++++++ test/800-smali/smali/b_22331663_pass.smali | 22 ++++++++++++++++++++++ test/800-smali/src/Main.java | 4 ++++ 4 files changed, 48 insertions(+) create mode 100644 test/800-smali/smali/b_22331663_fail.smali create mode 100644 test/800-smali/smali/b_22331663_pass.smali (limited to 'test/800-smali') diff --git a/test/800-smali/expected.txt b/test/800-smali/expected.txt index aa997a6..659f104 100644 --- a/test/800-smali/expected.txt +++ b/test/800-smali/expected.txt @@ -25,4 +25,6 @@ b/22080519 b/21645819 b/22244733 b/22331663 +b/22331663 (pass) +b/22331663 (fail) Done! diff --git a/test/800-smali/smali/b_22331663_fail.smali b/test/800-smali/smali/b_22331663_fail.smali new file mode 100644 index 0000000..0c25e30 --- /dev/null +++ b/test/800-smali/smali/b_22331663_fail.smali @@ -0,0 +1,20 @@ +.class public LB22331663Fail; +.super Ljava/lang/Object; + + +.method public static run(Z)V +.registers 6 + if-eqz v5, :Label1 + + # Construct a java.lang.Object completely. This makes v4 of reference type. + new-instance v4, Ljava/lang/Object; + invoke-direct {v4}, Ljava/lang/Object;->()V + +:Label1 + # At this point, v4 is the merge of Undefined and ReferenceType. The verifier should + # reject any use of this, even a copy. Previously this was a conflict. Conflicts must + # be movable now, so ensure that we do not get a conflict (and then allow the move). + move-object v0, v4 + + return-void +.end method diff --git a/test/800-smali/smali/b_22331663_pass.smali b/test/800-smali/smali/b_22331663_pass.smali new file mode 100644 index 0000000..1b54180 --- /dev/null +++ b/test/800-smali/smali/b_22331663_pass.smali @@ -0,0 +1,22 @@ +.class public LB22331663Pass; +.super Ljava/lang/Object; + + +.method public static run(Z)V +.registers 6 + if-eqz v5, :Label1 + + # Construct a java.lang.Object completely. This makes v4 of reference type. + new-instance v4, Ljava/lang/Object; + invoke-direct {v4}, Ljava/lang/Object;->()V + +:Label1 + # At this point, v4 is the merge of Undefined and ReferenceType. The verifier should not + # reject this if it is unused. + + # Do an allocation here. This will force heap checking in gcstress mode. + new-instance v0, Ljava/lang/Object; + invoke-direct {v0}, Ljava/lang/Object;->()V + + return-void +.end method diff --git a/test/800-smali/src/Main.java b/test/800-smali/src/Main.java index e0872c3..709c7f6 100644 --- a/test/800-smali/src/Main.java +++ b/test/800-smali/src/Main.java @@ -97,6 +97,10 @@ public class Main { null, "abc")); testCases.add(new TestCase("b/22331663", "B22331663", "run", new Object[] { false }, null, null)); + testCases.add(new TestCase("b/22331663 (pass)", "B22331663Pass", "run", + new Object[] { false }, null, null)); + testCases.add(new TestCase("b/22331663 (fail)", "B22331663Fail", "run", + new Object[] { false }, new VerifyError(), null)); } public void runTests() { -- cgit v1.1