| # Copyright (C) 2017 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| .class public LSmaliTests; |
| .super Ljava/lang/Object; |
| |
| ## CHECK-START: char SmaliTests.stringCharAtCatch(java.lang.String, int) instruction_simplifier (before) |
| ## CHECK-DAG: <<Char:c\d+>> InvokeVirtual intrinsic:StringCharAt |
| ## CHECK-DAG: Return [<<Char>>] |
| |
| ## CHECK-START: char SmaliTests.stringCharAtCatch(java.lang.String, int) instruction_simplifier (after) |
| ## CHECK-DAG: <<String:l\d+>> ParameterValue |
| ## CHECK-DAG: <<Pos:i\d+>> ParameterValue |
| ## CHECK-DAG: <<NullCk:l\d+>> NullCheck [<<String>>] |
| ## CHECK-DAG: <<Length:i\d+>> ArrayLength [<<NullCk>>] is_string_length:true |
| ## CHECK-DAG: <<Bounds:i\d+>> BoundsCheck [<<Pos>>,<<Length>>] is_string_char_at:true |
| ## CHECK-DAG: <<Char:c\d+>> ArrayGet [<<NullCk>>,<<Bounds>>] is_string_char_at:true |
| ## CHECK-DAG: Return [<<Char>>] |
| |
| ## CHECK-START: char SmaliTests.stringCharAtCatch(java.lang.String, int) instruction_simplifier (after) |
| ## CHECK-NOT: InvokeVirtual intrinsic:StringCharAt |
| .method public static stringCharAtCatch(Ljava/lang/String;I)C |
| .registers 4 |
| .param p0, "s" # Ljava/lang/String; |
| .param p1, "pos" # I |
| |
| .prologue |
| |
| # if (doThrow) { throw new Error(); } |
| sget-boolean v1, LMain;->doThrow:Z |
| if-eqz v1, :doThrow_false |
| new-instance v1, Ljava/lang/Error; |
| invoke-direct {v1}, Ljava/lang/Error;-><init>()V |
| throw v1 |
| |
| :doThrow_false |
| :try_start |
| # tmp = s.charAt(pos) |
| invoke-virtual {p0, p1}, Ljava/lang/String;->charAt(I)C |
| :try_end |
| .catch Ljava/lang/StringIndexOutOfBoundsException; {:try_start .. :try_end} :catch |
| |
| # return tmp |
| move-result v1 |
| return v1 |
| |
| :catch |
| # return '\0' |
| move-exception v0 |
| const/4 v1, 0x0 |
| return v1 |
| .end method |
| |