From 2b3ea645f330c2e4ab9a94acca9cecec5f388cc2 Mon Sep 17 00:00:00 2001 From: "fschneider@google.com" Date: Tue, 14 Aug 2012 11:18:48 +0000 Subject: [PATCH] Fix crash bug when replacing a definition with a definition that has no uses. TEST=vm/intermediate_language_test.cc Review URL: https://chromiumcodereview.appspot.com//10826299 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@10630 260f80e4-7a28-3924-810f-c04153c831b5 --- runtime/vm/intermediate_language.cc | 7 +++++-- runtime/vm/intermediate_language_test.cc | 6 ++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc index 832214bdde8..f7bc0062642 100644 --- a/runtime/vm/intermediate_language.cc +++ b/runtime/vm/intermediate_language.cc @@ -312,9 +312,12 @@ void Definition::ReplaceUsesWith(Definition* other) { } current->definition_ = other; - current->next_use_ = other->use_list(); - other->use_list()->previous_use_ = current; + if (other->use_list() != NULL) { + current->next_use_ = other->use_list(); + other->use_list()->previous_use_ = current; + } other->set_use_list(head); + set_use_list(NULL); } diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc index 2f7d5ae5f31..fd941fd90a5 100644 --- a/runtime/vm/intermediate_language_test.cc +++ b/runtime/vm/intermediate_language_test.cc @@ -39,6 +39,12 @@ TEST_CASE(DefUseTests) { BindInstr* bind = new BindInstr(BindInstr::kUsed, use2); bind->RemoveInputUses(); EXPECT(def1->use_list() == NULL); + // Test replacing with a definition without uses. + UseVal* use4 = new UseVal(def2); + def2->ReplaceUsesWith(def1); + EXPECT(def1->use_list() == use4); + EXPECT(def2->use_list() == NULL); + EXPECT(use4->definition() == def1); } } // namespace dart