diff options
| author | Dan Bornstein <danfuzz@android.com> | 2010-02-22 16:08:53 -0800 |
|---|---|---|
| committer | Dan Bornstein <danfuzz@android.com> | 2010-02-22 16:08:53 -0800 |
| commit | 05c9d91a7fd80fef3141b832fc8caeef44612c86 (patch) | |
| tree | f381190a5ed135263c02d05345e1121d3563aa82 /dx | |
| parent | e05ff80e7f496f41f2f543dcc7c64cbed5e9288e (diff) | |
| download | android_dalvik-05c9d91a7fd80fef3141b832fc8caeef44612c86.tar.gz android_dalvik-05c9d91a7fd80fef3141b832fc8caeef44612c86.tar.bz2 android_dalvik-05c9d91a7fd80fef3141b832fc8caeef44612c86.zip | |
Add a test case for the jsr / invoke bug. (See the included
info.txt for more details.)
Change-Id: I6ae5266e3f3371406c366d4f4644a445875adf95
Diffstat (limited to 'dx')
| -rw-r--r-- | dx/tests/112-dex-return-jsr-result/blort.j | 41 | ||||
| -rw-r--r-- | dx/tests/112-dex-return-jsr-result/expected.txt | 2 | ||||
| -rw-r--r-- | dx/tests/112-dex-return-jsr-result/info.txt | 6 | ||||
| -rw-r--r-- | dx/tests/112-dex-return-jsr-result/run | 63 |
4 files changed, 112 insertions, 0 deletions
diff --git a/dx/tests/112-dex-return-jsr-result/blort.j b/dx/tests/112-dex-return-jsr-result/blort.j new file mode 100644 index 000000000..6f6cddb93 --- /dev/null +++ b/dx/tests/112-dex-return-jsr-result/blort.j @@ -0,0 +1,41 @@ +; Copyright (C) 2010 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 blort +.super java/lang/Object + +.method public static zorch(ZLjava/lang/Object;)Ljava/lang/Object; + .limit locals 3 + .limit stack 1 + + iload_0 + ifeq thenBlock + jsr subroutine + goto endBlock + +thenBlock: + jsr subroutine + goto endBlock + +subroutine: + astore_2 + aload_1 + invokestatic java/lang/String/valueOf(Ljava/lang/Object;)Ljava/lang/String; + astore_1 + ret 2 + +endBlock: + aload_1 + areturn +.end method diff --git a/dx/tests/112-dex-return-jsr-result/expected.txt b/dx/tests/112-dex-return-jsr-result/expected.txt new file mode 100644 index 000000000..0e32069e4 --- /dev/null +++ b/dx/tests/112-dex-return-jsr-result/expected.txt @@ -0,0 +1,2 @@ +Generated: ./blort.class +total invokes: 2 diff --git a/dx/tests/112-dex-return-jsr-result/info.txt b/dx/tests/112-dex-return-jsr-result/info.txt new file mode 100644 index 000000000..289ebb2ee --- /dev/null +++ b/dx/tests/112-dex-return-jsr-result/info.txt @@ -0,0 +1,6 @@ +This test checks to make sure a result returned more-or-less directly +from a jsr subroutine ends up being represented appropriately. + +In particular, this is a regression test for a bug which caused a +goto instruction to be interposed between an invoke instruction and +its associated move-result. diff --git a/dx/tests/112-dex-return-jsr-result/run b/dx/tests/112-dex-return-jsr-result/run new file mode 100644 index 000000000..4075d1633 --- /dev/null +++ b/dx/tests/112-dex-return-jsr-result/run @@ -0,0 +1,63 @@ +#!/bin/bash +# +# Copyright (C) 2010 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. + +# The awk fun here tries to cull out all but the salient bits. The aim +# is to check to see that there are two invoke-static instructions, each +# followed directly by a move-result-object. + +jasmin -d . blort.j +dx --debug --dex --dump-to=- --dump-method=blort.zorch --dump-width=200 \ + blort.class | awk ' + +BEGIN { + invokeAt = -1; + moveAt = -1; + invokeCount = 0; + failed = 0; +} + +# Note: This has to be done before the test clause below. +/move-result-object/ { + moveAt = NR; +} + +(invokeAt > 0) { + if (moveAt != (invokeAt + 1)) { + failed = 1; + } + invokeAt = -1; + moveAt = -1; +} + +# Note: This has to be done after the test clause above. +/invoke-static/ { + invokeAt = NR; + invokeCount++; +} + +END { + printf("total invokes: %d\n", invokeCount); + if (failed) { + exit 1; + } +} +' + +if [ "$?" = "1" ]; then + # The test failed. Be helpful and print the entire method body. + dx --debug --dex --dump-to=- --dump-method=blort.zorch --dump-width=200 \ + blort.class +fi |
