diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/412-new-array/info.txt | 2 | ||||
| -rw-r--r-- | test/412-new-array/smali/fill_array_data.smali | 15 | ||||
| -rw-r--r-- | test/412-new-array/src/Main.java | 39 |
3 files changed, 56 insertions, 0 deletions
diff --git a/test/412-new-array/info.txt b/test/412-new-array/info.txt index cb388b6023..b5f834aa31 100644 --- a/test/412-new-array/info.txt +++ b/test/412-new-array/info.txt @@ -1 +1,3 @@ Simple tests for new-array, filled-new-array and fill-array-data. +Regression test for the arm64 mterp miscalculating the fill-array-data-payload +address, zero-extending a register instead of sign-extending. diff --git a/test/412-new-array/smali/fill_array_data.smali b/test/412-new-array/smali/fill_array_data.smali index 34776db5de..2b24e56cef 100644 --- a/test/412-new-array/smali/fill_array_data.smali +++ b/test/412-new-array/smali/fill_array_data.smali @@ -15,6 +15,21 @@ .end method +.method public static intArrayFillInstructionAfterData([I)V + .registers 1 + goto :FillInstruction + +:ArrayData + .array-data 4 + 1 2 3 4 5 + .end array-data + +:FillInstruction + fill-array-data v0, :ArrayData + return-void + +.end method + .method public static shortArray([S)V .registers 1 diff --git a/test/412-new-array/src/Main.java b/test/412-new-array/src/Main.java index b9c2a053e0..d95d2c52f3 100644 --- a/test/412-new-array/src/Main.java +++ b/test/412-new-array/src/Main.java @@ -259,6 +259,45 @@ public class Main extends TestCase { } { + Method m = c.getMethod("intArrayFillInstructionAfterData", int[].class); + int[] array = new int[7]; + Object[] args = { array }; + m.invoke(null, args); + assertEquals(7, array.length); + assertEquals(1, array[0]); + assertEquals(2, array[1]); + assertEquals(3, array[2]); + assertEquals(4, array[3]); + assertEquals(5, array[4]); + assertEquals(0, array[5]); + assertEquals(0, array[6]); + + array = new int[2]; + args[0] = array; + Throwable exception = null; + try { + m.invoke(null, args); + } catch (InvocationTargetException e) { + exception = e.getCause(); + assertTrue(exception instanceof IndexOutOfBoundsException); + } + assertNotNull(exception); + exception = null; + // Test that nothing has been written to the array. + assertEquals(0, array[0]); + assertEquals(0, array[1]); + + args[0] = null; + try { + m.invoke(null, args); + } catch (InvocationTargetException e) { + exception = e.getCause(); + assertTrue(exception instanceof NullPointerException); + } + assertNotNull(exception); + } + + { Method m = c.getMethod("shortArray", short[].class); short[] array = new short[7]; Object[] args = { array }; |