diff options
author | 2016-12-15 09:36:31 -0800 | |
---|---|---|
committer | 2016-12-15 11:03:38 -0800 | |
commit | ab2270f8f7ecd93c7ba353dd4e300669de3e7aee (patch) | |
tree | 113e6b264117bc9a3217a2d1685a09bb589075f8 | |
parent | 9538f9e2a5d03f1b1bc07ebfbd93b61dcf8ad604 (diff) |
Fixed signal 11 bug by not testing resolved method first.
Test: test-art-host
Bug: 33656359
Change-Id: Idb1afccf811a2fbf7500fc1d953e118981ad36d4
-rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 3 | ||||
-rw-r--r-- | test/624-checker-stringops/src/Main.java | 16 |
2 files changed, 18 insertions, 1 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index c615df1f1d..439e3b66db 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -1897,7 +1897,8 @@ void InstructionSimplifierVisitor::SimplifyReturnThis(HInvoke* invoke) { static bool NoEscapeForStringBufferReference(HInstruction* reference, HInstruction* user) { if (user->IsInvokeStaticOrDirect()) { // Any constructor on StringBuffer is okay. - return user->AsInvokeStaticOrDirect()->GetResolvedMethod()->IsConstructor() && + return user->AsInvokeStaticOrDirect()->GetResolvedMethod() != nullptr && + user->AsInvokeStaticOrDirect()->GetResolvedMethod()->IsConstructor() && user->InputAt(0) == reference; } else if (user->IsInvokeVirtual()) { switch (user->AsInvokeVirtual()->GetIntrinsic()) { diff --git a/test/624-checker-stringops/src/Main.java b/test/624-checker-stringops/src/Main.java index d965e3ffce..75b782e8c0 100644 --- a/test/624-checker-stringops/src/Main.java +++ b/test/624-checker-stringops/src/Main.java @@ -258,6 +258,20 @@ public class Main { return b.length(); } + // Regression b/33656359: StringBuffer x is passed to constructor of String + // (this caused old code to crash due to missing nullptr check). + // + /// CHECK-START: void Main.doesNothing() instruction_simplifier (before) + /// CHECK-DAG: InvokeVirtual intrinsic:StringBufferToString + // + /// CHECK-START: void Main.doesNothing() instruction_simplifier (after) + /// CHECK-DAG: InvokeVirtual intrinsic:StringBufferToString + static void doesNothing() { + StringBuffer x = new StringBuffer(); + String y = new String(x); + x.toString(); + } + public static void main(String[] args) { expectEquals(1865, liveIndexOf()); expectEquals(29, deadIndexOf()); @@ -281,6 +295,8 @@ public class Main { expectEquals(0, bufferDeadLoop()); expectEquals(0, builderDeadLoop()); + doesNothing(); + System.out.println("passed"); } |