diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java index a31e41408c1143da75dcfd64d040342bdded2b69..6814de2825aac31571ad64a0a9566dc7debe1e5b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java @@ -19,29 +19,59 @@ import static jadx.core.utils.Utils.lockList; public final class BlockNode extends AttrNode implements IBlock, Comparable { + /** + * Const ID + */ + private final int cid; + + /** + * ID linked to position in blocks list (easier to use BitSet) + * TODO: rename to avoid confusion + */ private int id; + + /** + * Offset in methods bytecode + */ private final int startOffset; + private final List instructions = new ArrayList<>(2); private List predecessors = new ArrayList<>(1); private List successors = new ArrayList<>(1); private List cleanSuccessors; - // all dominators + /** + * All dominators, excluding self + */ private BitSet doms = EmptyBitSet.EMPTY; - // dominance frontier + + /** + * Dominance frontier + */ private BitSet domFrontier; - // immediate dominator + + /** + * Immediate dominator + */ private BlockNode idom; - // blocks on which dominates this block + + /** + * Blocks on which dominates this block + */ private List dominatesOn = new ArrayList<>(3); - public BlockNode(int id, int offset) { + public BlockNode(int cid, int id, int offset) { + this.cid = cid; this.id = id; this.startOffset = offset; } - public void setId(int id) { + public int getCId() { + return cid; + } + + void setId(int id) { this.id = id; } @@ -188,12 +218,12 @@ public final class BlockNode extends AttrNode implements IBlock, Comparable argsList; private InsnNode[] instructions; private List blocks; + private int blocksMaxCId; private BlockNode enterBlock; private BlockNode exitBlock; private List sVars; @@ -318,6 +319,15 @@ public class MethodNode extends NotificationAttrNode implements IMethodDetails, public void setBasicBlocks(List blocks) { this.blocks = blocks; + int i = 0; + for (BlockNode block : blocks) { + block.setId(i); + i++; + } + } + + public int getNextBlockCId() { + return blocksMaxCId++; } public BlockNode getEnterBlock() { diff --git a/jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java b/jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java index 3e394d4d4028e72e10f11888824641f94d8c59f8..c1df755ad79c25ec621ce05ab8cb5550b7e60451 100644 --- a/jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java @@ -60,6 +60,10 @@ public class TryCatchBlockAttr implements IJadxAttribute { return throwFound; } + public int getId() { + return id; + } + public List getHandlers() { return handlers; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java index eb627d774e99af8c965bdcc5e054df364d26ee2d..8840addea67ac287a9bac02b6266f1b05270c101 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java @@ -100,7 +100,7 @@ public class DotGraphVisitor extends AbstractVisitor { if (insnArr == null) { return; } - BlockNode block = new BlockNode(0, 0); + BlockNode block = new BlockNode(0, 0, 0); List insnList = block.getInstructions(); for (InsnNode insn : insnArr) { if (insn != null) { @@ -199,7 +199,7 @@ public class DotGraphVisitor extends AbstractVisitor { dot.add("color=red,"); } dot.add("label=\"{"); - dot.add(String.valueOf(block.getId())).add("\\:\\ "); + dot.add(String.valueOf(block.getCId())).add("\\:\\ "); dot.add(InsnUtils.formatOffset(block.getStartOffset())); if (!attrs.isEmpty()) { dot.add('|').add(attrs); @@ -230,10 +230,10 @@ public class DotGraphVisitor extends AbstractVisitor { if (PRINT_DOMINATORS) { for (BlockNode c : block.getDominatesOn()) { - conn.startLine(block.getId() + " -> " + c.getId() + "[color=green];"); + conn.startLine(block.getCId() + " -> " + c.getCId() + "[color=green];"); } for (BlockNode dom : BlockUtils.bitSetToBlocks(mth, block.getDomFrontier())) { - conn.startLine("f_" + block.getId() + " -> f_" + dom.getId() + "[color=blue];"); + conn.startLine("f_" + block.getCId() + " -> f_" + dom.getCId() + "[color=blue];"); } } } @@ -273,7 +273,7 @@ public class DotGraphVisitor extends AbstractVisitor { private String makeName(IContainer c) { String name; if (c instanceof BlockNode) { - name = "Node_" + ((BlockNode) c).getId(); + name = "Node_" + ((BlockNode) c).getCId(); } else if (c instanceof IBlock) { name = "Node_" + c.getClass().getSimpleName() + '_' + c.hashCode(); } else { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java index bff1cff5e99285f4c1fe22db8ebd5587d15cf9cf..03842bb28ebe2f3516076d75f2f60950d7379d2b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java @@ -171,10 +171,6 @@ public class BlockExceptionHandler { } } - protected static void removeTmpConnections(MethodNode mth) { - mth.getBasicBlocks().forEach(BlockExceptionHandler::removeTmpConnection); - } - private static void removeTmpConnection(BlockNode block) { TmpEdgeAttr tmpEdgeAttr = block.get(AType.TMP_EDGE); if (tmpEdgeAttr != null) { @@ -402,6 +398,13 @@ public class BlockExceptionHandler { } BlockNode topDom = BlockUtils.getCommonDominator(mth, blocks); if (topDom != null) { + // dominator always return one up block if blocks already contains dominator, use successor instead + if (topDom.getSuccessors().size() == 1) { + BlockNode upBlock = topDom.getSuccessors().get(0); + if (blocks.contains(upBlock)) { + return upBlock; + } + } return adjustTopBlock(topDom); } throw new JadxRuntimeException("Failed to find top block for try-catch from: " + blocks); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java index 532517d66350e9fde917e4246df0bda14ee45ef3..e9003e8ff7064317902692aa19edbc45dd128557 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java @@ -137,8 +137,9 @@ public class BlockSplitter extends AbstractVisitor { } static BlockNode startNewBlock(MethodNode mth, int offset) { - BlockNode block = new BlockNode(mth.getBasicBlocks().size(), offset); - mth.getBasicBlocks().add(block); + List blocks = mth.getBasicBlocks(); + BlockNode block = new BlockNode(mth.getNextBlockCId(), blocks.size(), offset); + blocks.add(block); return block; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java index dd60d57905a96bcf1f013c8536c764633d70a77f..7fdcc9e1b42b703acf9c3b462a901ed3fe7c3e06 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java @@ -25,23 +25,16 @@ public class DominatorTree { List sorted = sortBlocks(mth); BlockNode[] doms = build(sorted); apply(sorted, doms); - mth.setBasicBlocks(sorted); } private static List sortBlocks(MethodNode mth) { int blocksCount = mth.getBasicBlocks().size(); - BitSet reachSet = new BitSet(blocksCount); List sorted = new ArrayList<>(blocksCount); - BlockUtils.dfsVisit(mth, b -> { - sorted.add(b); - reachSet.set(b.getId()); - }); - if (reachSet.cardinality() != blocksCount) { + BlockUtils.dfsVisit(mth, sorted::add); + if (sorted.size() != blocksCount) { throw new JadxRuntimeException("Found unreachable blocks"); } - for (int i = 0; i < blocksCount; i++) { - sorted.get(i).setId(i); - } + mth.setBasicBlocks(sorted); return sorted; } diff --git a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java index db943463976560bd17a7594505aa568041eafad6..7123b24da4fa62cebb8999c1d976b72c7f60c920 100644 --- a/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/BlockUtils.java @@ -697,7 +697,7 @@ public class BlockUtils { } /** - * Search lowest common ancestor in dominator tree for input set. + * Search the lowest common ancestor in dominator tree for input set. */ @Nullable public static BlockNode getCommonDominator(MethodNode mth, List blocks) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java new file mode 100644 index 0000000000000000000000000000000000000000..3055a3e3406ce291ed64e8e7335eb313e2030773 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java @@ -0,0 +1,18 @@ +package jadx.tests.integration.trycatch; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestNestedTryCatch4 extends SmaliTest { + + @Test + public void test() { + disableCompilation(); + assertThat(getClassNodeFromSmali()) + .code() + .doesNotContain("?? "); + } +} diff --git a/jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali b/jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali new file mode 100644 index 0000000000000000000000000000000000000000..cfb0a00509d68efab66b4a905ae213a5b848c37b --- /dev/null +++ b/jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali @@ -0,0 +1,601 @@ +.class public Ltrycatch/TestNestedTryCatch4; +.super Landroid/app/NativeActivity; + +.method private test(Landroid/content/Intent;)V + .registers 11 + .annotation system Ldalvik/annotation/MethodParameters; + accessFlags = { + 0x0 + } + names = { + "intent" + } + .end annotation + + const-string v0, "IOException while closing input stream\n" + + if-nez p1, :cond_5 + + return-void + + :cond_5 + const-string v1, "intent_cmd" + + .line 1740 + invoke-virtual {p1, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String; + + move-result-object v1 + + const-string v2, "MCPE" + + if-eqz v1, :cond_80 + + .line 1741 + invoke-virtual {v1}, Ljava/lang/String;->length()I + + move-result v3 + + if-lez v3, :cond_80 + + .line 1743 + :try_start_15 + new-instance p1, Lorg/json/JSONObject; + + invoke-direct {p1, v1}, Lorg/json/JSONObject;->(Ljava/lang/String;)V + + const-string v0, "Command" + + .line 1744 + invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; + + move-result-object v0 + + const-string v1, "keyboardResult" + + .line 1745 + invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v1 + + if-eqz v1, :cond_33 + + const-string v0, "Text" + + .line 1746 + invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {p0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeSetTextboxText(Ljava/lang/String;)V + + goto/16 :goto_208 + + :cond_33 + const-string v1, "fileDialogResult" + + .line 1748 + invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_208 + + iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J + + const-wide/16 v3, 0x0 + + cmp-long v5, v0, v3 + + if-eqz v5, :cond_208 + + const-string v0, "Result" + + .line 1749 + invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; + + move-result-object v0 + + const-string v1, "Ok" + + invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_5d + + .line 1750 + iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J + + const-string v5, "Path" + + invoke-virtual {p1, v5}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {p0, v0, v1, p1}, Ltrycatch/TestNestedTryCatch4;->nativeOnPickImageSuccess(JLjava/lang/String;)V + + goto :goto_62 + + .line 1753 + :cond_5d + iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J + + invoke-virtual {p0, v0, v1}, Ltrycatch/TestNestedTryCatch4;->nativeOnPickImageCanceled(J)V + + .line 1755 + :goto_62 + iput-wide v3, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J + :try_end_64 + .catch Lorg/json/JSONException; {:try_start_15 .. :try_end_64} :catch_66 + + goto/16 :goto_208 + + :catch_66 + move-exception p1 + + .line 1759 + new-instance v0, Ljava/lang/StringBuilder; + + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + + const-string v1, "JSONObject exception:" + + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Lorg/json/JSONException;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-static {v2, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I + + return-void + + .line 1765 + :cond_80 + invoke-virtual {p1}, Landroid/content/Intent;->getAction()Ljava/lang/String; + + move-result-object v1 + + .line 1766 + invoke-virtual {p1}, Landroid/content/Intent;->getType()Ljava/lang/String; + + const-string/jumbo v3, "xbox_live_game_invite" + + .line 1768 + invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v3 + + if-eqz v3, :cond_b0 + + const-string/jumbo v0, "xbl" + + .line 1771 + invoke-virtual {p1, v0}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String; + + move-result-object p1 + + .line 1772 + new-instance v0, Ljava/lang/StringBuilder; + + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + + const-string v3, "[XboxLive] Received Invite " + + invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v0 + + invoke-static {v2, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I + + .line 1776 + invoke-virtual {p0, v1, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V + + goto/16 :goto_208 + + :cond_b0 + const-string v3, "android.intent.action.VIEW" + + .line 1779 + invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v3 + + if-nez v3, :cond_c0 + + const-string v3, "org.chromium.arc.intent.action.VIEW" + + invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v1 + + if-eqz v1, :cond_208 + + .line 1780 + :cond_c0 + invoke-virtual {p1}, Landroid/content/Intent;->getScheme()Ljava/lang/String; + + move-result-object v1 + + .line 1781 + invoke-virtual {p1}, Landroid/content/Intent;->getData()Landroid/net/Uri; + + move-result-object p1 + + if-nez p1, :cond_cb + + return-void + + :cond_cb + const-string v3, "minecraft" + + .line 1787 + invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + if-nez v3, :cond_1f9 + + const-string v3, "minecraftedu" + + invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + if-eqz v3, :cond_dd + + goto/16 :goto_1f9 + + :cond_dd + const-string v3, "file" + + .line 1795 + invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v3 + + const-string v4, "&" + + if-eqz v3, :cond_108 + + .line 1798 + new-instance v0, Ljava/lang/StringBuilder; + + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String; + + move-result-object v1 + + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + const-string v0, "fileIntent" + + invoke-virtual {p0, v0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V + + goto/16 :goto_208 + + :cond_108 + const-string v3, "content" + + .line 1800 + invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z + + move-result v1 + + if-eqz v1, :cond_208 + + .line 1803 + new-instance v1, Ljava/io/File; + + invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String; + + move-result-object v3 + + invoke-direct {v1, v3}, Ljava/io/File;->(Ljava/lang/String;)V + + invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String; + + move-result-object v1 + + .line 1804 + new-instance v3, Ljava/io/File; + + new-instance v5, Ljava/lang/StringBuilder; + + invoke-direct {v5}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p0}, Ltrycatch/TestNestedTryCatch4;->getApplicationContext()Landroid/content/Context; + + move-result-object v6 + + invoke-virtual {v6}, Landroid/content/Context;->getCacheDir()Ljava/io/File; + + move-result-object v6 + + invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; + + const-string v6, "/" + + invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v5, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v1 + + invoke-direct {v3, v1}, Ljava/io/File;->(Ljava/lang/String;)V + + .line 1806 + invoke-virtual {p0}, Ltrycatch/TestNestedTryCatch4;->getContentResolver()Landroid/content/ContentResolver; + + move-result-object v1 + + .line 1810 + :try_start_142 + invoke-virtual {v1, p1}, Landroid/content/ContentResolver;->openInputStream(Landroid/net/Uri;)Ljava/io/InputStream; + + move-result-object v1 + :try_end_146 + .catch Ljava/io/IOException; {:try_start_142 .. :try_end_146} :catch_1df + + .line 1818 + :try_start_146 + new-instance v5, Ljava/io/FileOutputStream; + + invoke-direct {v5, v3}, Ljava/io/FileOutputStream;->(Ljava/io/File;)V + + const/high16 v6, 0x100000 + + new-array v6, v6, [B + + .line 1824 + :goto_14f + invoke-virtual {v1, v6}, Ljava/io/InputStream;->read([B)I + + move-result v7 + + const/4 v8, -0x1 + + if-eq v7, v8, :cond_15b + + const/4 v8, 0x0 + + .line 1825 + invoke-virtual {v5, v6, v8, v7}, Ljava/io/OutputStream;->write([BII)V + + goto :goto_14f + + .line 1828 + :cond_15b + invoke-virtual {v5}, Ljava/io/OutputStream;->close()V + + const-string v5, "contentIntent" + + .line 1831 + new-instance v6, Ljava/lang/StringBuilder; + + invoke-direct {v6}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v6, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v6, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v3}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v6, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {p0, v5, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V + :try_end_17d + .catch Ljava/io/IOException; {:try_start_146 .. :try_end_17d} :catch_18b + .catchall {:try_start_146 .. :try_end_17d} :catchall_189 + + .line 1842 + :try_start_17d + invoke-virtual {v1}, Ljava/io/InputStream;->close()V + :try_end_180 + .catch Ljava/io/IOException; {:try_start_17d .. :try_end_180} :catch_182 + + goto/16 :goto_208 + + :catch_182 + move-exception p1 + + .line 1845 + new-instance v1, Ljava/lang/StringBuilder; + + invoke-direct {v1}, Ljava/lang/StringBuilder;->()V + + goto :goto_1b1 + + :catchall_189 + move-exception p1 + + goto :goto_1c3 + + :catch_18b + move-exception p1 + + .line 1833 + :try_start_18c + new-instance v4, Ljava/lang/StringBuilder; + + invoke-direct {v4}, Ljava/lang/StringBuilder;->()V + + const-string v5, "IOException while copying file from content intent\n" + + invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v4, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I + :try_end_1a4 + .catchall {:try_start_18c .. :try_end_1a4} :catchall_189 + + .line 1837 + :try_start_1a4 + invoke-virtual {v3}, Ljava/io/File;->delete()Z + :try_end_1a7 + .catch Ljava/lang/Exception; {:try_start_1a4 .. :try_end_1a7} :catch_1a7 + .catchall {:try_start_1a4 .. :try_end_1a7} :catchall_189 + + .line 1842 + :catch_1a7 + :try_start_1a7 + invoke-virtual {v1}, Ljava/io/InputStream;->close()V + :try_end_1aa + .catch Ljava/io/IOException; {:try_start_1a7 .. :try_end_1aa} :catch_1ab + + goto :goto_208 + + :catch_1ab + move-exception p1 + + .line 1845 + new-instance v1, Ljava/lang/StringBuilder; + + invoke-direct {v1}, Ljava/lang/StringBuilder;->()V + + :goto_1b1 + invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I + + goto :goto_208 + + .line 1842 + :goto_1c3 + :try_start_1c3 + invoke-virtual {v1}, Ljava/io/InputStream;->close()V + :try_end_1c6 + .catch Ljava/io/IOException; {:try_start_1c3 .. :try_end_1c6} :catch_1c7 + + goto :goto_1de + + :catch_1c7 + move-exception v1 + + .line 1845 + new-instance v3, Ljava/lang/StringBuilder; + + invoke-direct {v3}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v1}, Ljava/io/IOException;->toString()Ljava/lang/String; + + move-result-object v0 + + invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v0 + + invoke-static {v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I + + .line 1847 + :goto_1de + throw p1 + + :catch_1df + move-exception p1 + + .line 1813 + new-instance v0, Ljava/lang/StringBuilder; + + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + + const-string v1, "IOException while opening file from content intent\n" + + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object p1 + + invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I + + return-void + + .line 1788 + :cond_1f9 + :goto_1f9 + invoke-virtual {p1}, Landroid/net/Uri;->getHost()Ljava/lang/String; + + move-result-object v0 + + .line 1789 + invoke-virtual {p1}, Landroid/net/Uri;->getQuery()Ljava/lang/String; + + move-result-object p1 + + if-nez v0, :cond_205 + + if-eqz p1, :cond_208 + + .line 1792 + :cond_205 + invoke-virtual {p0, v0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V + + :cond_208 + :goto_208 + return-void +.end method