| # 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. |
| |
| .class public LTest; |
| |
| .super Ljava/lang/Object; |
| |
| .method private static throwOnPositive(I)V |
| .registers 2 |
| if-lez v1, :cond_nothrow |
| new-instance v0, Ljava/lang/RuntimeException; |
| invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V |
| throw v0 |
| :cond_nothrow |
| return-void |
| .end method |
| |
| # Tests the flow of values in the pathological case that the block is its own catch handler. |
| # This tests that the register allocator does not insert moves at the end of the throwing |
| # block since in the case of a throw the block does not actually complete. |
| .method static loopWhileThrow(I)I |
| .registers 4 |
| :catchall_0 |
| move v0, p0 |
| add-int/lit8 p0, p0, -0x1 |
| :try_start_6 |
| invoke-static {v0}, LTest;->throwOnPositive(I)V |
| :try_end_9 |
| .catchall {:try_start_6 .. :try_end_9} :catchall_0 |
| return p0 |
| .end method |
| |
| .method public static main([Ljava/lang/String;)V |
| .registers 2 |
| const v0, 0x64 |
| sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; |
| invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V |
| invoke-static {v0}, LTest;->loopWhileThrow(I)I |
| move-result v0 |
| invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V |
| return-void |
| .end method |