| // Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.smali; |
| |
| import com.android.tools.r8.CompilationFailedException; |
| import com.android.tools.r8.graph.DexEncodedMethod; |
| import com.android.tools.r8.smali.SmaliBuilder.MethodSignature; |
| import com.android.tools.r8.utils.AndroidApp; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import org.junit.Test; |
| |
| public class ComputeBlockTryRangeTest extends SmaliTestBase { |
| |
| @Test |
| public void jumpIntoTryRange() throws CompilationFailedException { |
| |
| SmaliBuilder builder = new SmaliBuilder("Test"); |
| |
| builder.addStaticMethod( |
| "void", "main", Arrays.asList("java.lang.String[]"), 2, |
| " sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;", |
| " const v0, 1", |
| " invoke-static {v0}, LTest;->method(I)I", |
| " move-result v0", |
| " invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V", |
| " const v0, 0", |
| " invoke-static {v0}, LTest;->method(I)I", |
| " move-result v0", |
| " invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V", |
| " return-void"); |
| |
| MethodSignature methodSig = builder.addStaticMethod( |
| "int", "method", Collections.singletonList("int"), 1, |
| " const v0, 42", |
| " goto :in_try", |
| ":try_start", |
| ":dead_code", |
| " const v0, 0", |
| ":in_try", |
| " div-int/2addr v0, v1", |
| " return v0", |
| ":try_end", |
| " .catch Ljava/io/IOException; {:try_start .. :try_end} :dead_code", |
| " .catch Ljava/lang/Throwable; {:try_start .. :try_end} :return_half", |
| ":return_half", |
| " const v1, 2", |
| " goto :in_try" |
| ); |
| |
| AndroidApp originalApplication = buildApplication(builder); |
| AndroidApp processedApplication = processApplication(originalApplication); |
| |
| DexEncodedMethod method = getMethod(processedApplication, methodSig); |
| assert method.getCode().asDexCode().tries.length > 0; |
| } |
| } |