| Tests the fix for b/74116990 |
| |
| The JIT was reading into incorrect dex files during class redefinition if a |
| native method was present. |
| |
| The transformed dex file is specifically crafted to have exactly 4 methodIDs in |
| it. They are (in order): |
| (0) Ljava/lang/Object;-><init>()V |
| (1) Lxyz/Transform;-><init>()V |
| (2) Lxyz/Transform;->bar()V |
| (3) Lxyz/Transform;->foo()V |
| |
| In the transformed version of the dex file there is a new method. The new list of methodIDs is: |
| (0) Lart/Test1949;->doNothing()V |
| (1) Ljava/lang/Object;-><init>()V |
| (2) Lxyz/Transform;-><init>()V |
| (3) Lxyz/Transform;->bar()V |
| (4) Lxyz/Transform;->foo()V |
| |
| This test tries to get the JIT to read out-of-bounds on the initial dex file by getting it to |
| read the 5th method id of the new file (Lxyz/Transform;->foo()V) from the old dex file (which |
| only has 4 method ids). |
| |
| To do this we need to make sure that the class being transformed is near the end of the |
| alphabet (package xyz, method foo). If it is further forward than the other method-ids then the |
| JIT will read an incorrect (but valid) method-id from the old-dex file. This is why the error |
| wasn't caught in our other tests (package art is always at the front). |
| |
| The final method that causes the OOB read needs to be a native method because that is the only |
| method-type the jit uses dex-file information to keep track of. |