blob: ffb18533e747f11f2cbc3bbb4f60c8006bcaf886 [file] [log] [blame]
# 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
## CHECK-START: char SmaliTests.stringCharAtCatchPhiReturn(java.lang.String, int) instruction_simplifier (before)
## CHECK-DAG: <<Int:i\d+>> IntConstant 0
## CHECK-DAG: <<Char:c\d+>> InvokeVirtual intrinsic:StringCharAt
## CHECK-DAG: <<Phi:i\d+>> Phi [<<Char>>,<<Int>>]
## CHECK-DAG: Return [<<Phi>>]
## CHECK-START: char SmaliTests.stringCharAtCatchPhiReturn(java.lang.String, int) instruction_simplifier (after)
## CHECK-DAG: <<String:l\d+>> ParameterValue
## CHECK-DAG: <<Pos:i\d+>> ParameterValue
## CHECK-DAG: <<Int:i\d+>> IntConstant 0
## 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: <<Phi:i\d+>> Phi [<<Char>>,<<Int>>]
## CHECK-DAG: Return [<<Phi>>]
## CHECK-START: char SmaliTests.stringCharAtCatchPhiReturn(java.lang.String, int) instruction_simplifier (after)
## CHECK-NOT: InvokeVirtual intrinsic:StringCharAt
.method public static stringCharAtCatchPhiReturn(Ljava/lang/String;I)C
.registers 4
sget-boolean v1, LMain;->doThrow:Z
if-eqz v1, :cond_a
new-instance v1, Ljava/lang/Error;
invoke-direct {v1}, Ljava/lang/Error;-><init>()V
throw v1
:cond_a
:try_start_a
invoke-virtual {p0, p1}, Ljava/lang/String;->charAt(I)C
:try_end_d
.catch Ljava/lang/StringIndexOutOfBoundsException; {:try_start_a .. :try_end_d} :catch_f
move-result v1
:goto_e
return v1
:catch_f
move-exception v0
const/4 v1, 0x0
goto :goto_e
.end method