From 05c9d91a7fd80fef3141b832fc8caeef44612c86 Mon Sep 17 00:00:00 2001 From: Dan Bornstein Date: Mon, 22 Feb 2010 16:08:53 -0800 Subject: [PATCH] Add a test case for the jsr / invoke bug. (See the included info.txt for more details.) Change-Id: I6ae5266e3f3371406c366d4f4644a445875adf95 --- dx/tests/112-dex-return-jsr-result/blort.j | 41 ++++++++++++++++ dx/tests/112-dex-return-jsr-result/expected.txt | 2 + dx/tests/112-dex-return-jsr-result/info.txt | 6 +++ dx/tests/112-dex-return-jsr-result/run | 63 +++++++++++++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 dx/tests/112-dex-return-jsr-result/blort.j create mode 100644 dx/tests/112-dex-return-jsr-result/expected.txt create mode 100644 dx/tests/112-dex-return-jsr-result/info.txt create mode 100644 dx/tests/112-dex-return-jsr-result/run 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 -- 2.11.0