From 49bace1ccbec6f12b5b475ccc2ce76e0b666b500 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Wed, 1 Jul 2015 15:28:26 +0100 Subject: Address additional comments on try-catch CL Extra documentation of try-catch building. Change-Id: I5048c5fcb354c76fa4a60c3d8d21dd216bc9f6cd --- compiler/optimizing/builder.cc | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'compiler/optimizing/builder.cc') diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 883c983fed..54155dbef4 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -346,11 +346,19 @@ void HGraphBuilder::InsertTryBoundaryBlocks(const DexFile::CodeItem& code_item) // Catch blocks are always considered an entry point into the TryItem in // order to avoid splitting exceptional edges (they might not have been // created yet). We separate the move-exception (if present) from the - // rest of the block and insert a TryBoundary after it. - HInstruction* split_position = try_block->GetFirstInstruction(); - if (split_position->IsLoadException()) { - DCHECK(split_position->GetNext()->IsStoreLocal()); - split_position = split_position->GetNext()->GetNext(); + // rest of the block and insert a TryBoundary after it, creating a + // landing pad for the exceptional edges. + HInstruction* first_insn = try_block->GetFirstInstruction(); + HInstruction* split_position = nullptr; + if (first_insn->IsLoadException()) { + // Catch block starts with a LoadException. Split the block after the + // StoreLocal that must come after the load. + DCHECK(first_insn->GetNext()->IsStoreLocal()); + split_position = first_insn->GetNext()->GetNext(); + } else { + // Catch block does not obtain the exception. Split at the beginning + // to create an empty catch block. + split_position = first_insn; } DCHECK(split_position != nullptr); HBasicBlock* catch_block = try_block; -- cgit v1.2.3-59-g8ed1b