; ; Licensed to the Apache Software Foundation (ASF) under one or more ; contributor license agreements. See the NOTICE file distributed with ; this work for additional information regarding copyright ownership. ; The ASF licenses this file to You 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 org/apache/harmony/drlvm/tests/regression/h3225/PositiveJsrTest .super junit/framework/TestCase .method public ()V aload_0 invokespecial junit/framework/TestCase/()V return .end method ; ; Launches testcases which check subroutine verification. ; .method public static main([Ljava/lang/String;)V .limit stack 1 .limit locals 1 ldc "org.apache.harmony.drlvm.tests.regression.h3225.PositiveJsrTest" invokestatic java/lang/Class/forName(Ljava/lang/String;)Ljava/lang.Class; invokestatic junit/textui/TestRunner/run(Ljava/lang/Class;)V return .end method ; ; Minimal number of locals is one since ; one passes a class reference. ; .method public testMinimalLimits()V .limit stack 0 .limit locals 1 return .end method ; ; A subroutine call can be the last instruction, ; when the subroutine doesn't return. ; .method public testLastJsr()V .limit stack 1 .limit locals 1 goto LabelEndMethod LabelReturn: return LabelEndMethod: jsr LabelReturn .end method ; ; Calls merge execution into common return instruction. ; .method public testCommonReturn()V .limit stack 1 .limit locals 1 aconst_null ifnull LabelCodeBranch jsr LabelSub1 LabelCodeBranch: jsr LabelSub2 LabelSub1: astore 0 goto LabelCommonPart LabelSub2: astore 0 goto LabelCommonPart LabelCommonPart: return .end method ; ; Multiple calls to one subroutine. ; .method public testMultipleCalls()V .limit stack 1 .limit locals 1 jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub return LabelSub: astore 0 ret 0 .end method ; ; A subroutine is called from another subroutine twice. ; .method public testNestedSubs()V .limit stack 1 .limit locals 2 jsr LabelSub jsr LabelSub return LabelSub: astore 0 jsr LabelSubSub ret 0 LabelSubSub: astore 1 ret 1 .end method ; ; A subroutine is called from the exception handler of ; the other subroutine. ; .method public testCallFromHandler()V .limit stack 1 .limit locals 2 jsr LabelSub jsr LabelSub return LabelSub: astore 0 jsr LabelSubSub LabelStartHandler: jsr LabelSubSub LabelEndHandler: ret 0 LabelSubSub: astore 1 ret 1 LabelHandler: pop jsr LabelSubSub return .catch all from LabelStartHandler to LabelEndHandler using LabelHandler .end method ; ; Subroutine contains different branches. ; .method public testBranches()V .limit stack 1 .limit locals 2 aconst_null astore_0 jsr LabelSub aload_0 pop iconst_0 istore_0 jsr LabelSub iload_0 return LabelSub: astore 1 LabelBranch: aconst_null ifnonnull LabelBranch aconst_null ifnull LabelRet goto LabelBranch LabelRet: ret 1 .end method ; ; A subroutine graph contains several unreachable nodes. ; .method public testUnreachableNodes()V .limit stack 1 .limit locals 1 return LabelBackward: aconst_null ifnull LabelForward aconst_null ifnull LabelBackward LabelForward: aconst_null ifnull LabelBackward jsr LabelBackward .end method ; ; A subroutine is called from another subroutine nine times. ; .method public testNineNestedSubs()V .limit stack 3 .limit locals 1 iconst_0 jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub jsr LabelSub bipush 81 swap invokestatic org/apache/harmony/drlvm/tests/regression/h3225/PositiveJsrTest/assertEquals(II)V return LabelSub: swap jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub jsr LabelSubSub swap astore 0 ret 0 LabelSubSub: astore 0 iconst_1 iadd ret 0 .end method ; ; Calls one subroutine after another in the subroutine context. ; .method public testSubAfterSub()V .limit stack 1 .limit locals 2 jsr LabelSub1 return LabelSub1: astore 0 jsr LabelSub2 jsr LabelSub2 jsr LabelSub3 jsr LabelSub3 ret 0 LabelSub2: astore 1 ret 1 LabelSub3: astore 1 ret 1 .end method ; ; An exception range ends at the end of the method. ; .method public testWideExceptionRange()V .limit stack 1 .limit locals 1 jsr LabelSub ldc "Constant" LabelStart: return LabelSub: astore 0 ret 0 LabelEnd: .catch all from LabelSub to LabelEnd using LabelStart .end method