At the moment, ARTist does not add additional registers if needed. Therefore injected instructions might override the value of previous instructions.
BasicBlock 0, succ: 1
3: CurrentMethod [27, 26]
0: ParameterValue(this) uses: [24, 23, 16, 9]
7: IntConstant: 1 uses: [19, 9]
8: IntConstant: 2 uses: [9]
13: LongConstant: 2 uses: [14]
20: IntConstant: 3 uses: [21]
1: SuspendCheck
2: Goto 1
BasicBlock 1, pred: 0, succ: 2
4: LoadString: 'caller' uses: [36, 6]
5: LoadString: 'caller is called!' uses: [6]
6: InvokeStaticOrDirect: android.util.Log.w(4, 5)
9: InvokeVirtual: de.alfink.minimalapp.MainActivity.mycallee2(0, 7, 8), uses: [10]
10: NullCheck(9) [42]
42: InstanceFieldGet(10) [12]
12: TypeConversion(42) [14]
14: Add(12, 13) [15]
15: TypeConversion(14) [31, 24, 22, 22, 21, 19, 16, 16]
16: InvokeVirtual: de.alfink.minimalapp.MainActivity.mycallee2(0, 15, 15), uses: [17]
17: NullCheck(16) [48]
48: InstanceFieldGet(17) [24]
19: Add(15, 7) [23]
21: Add(15, 20) [23]
22: Add(15, 15) []
23: InvokeVirtual: de.alfink.minimalapp.MainActivity.mycallee(0, 19, 21)
24: InvokeVirtual: de.alfink.minimalapp.MainActivity.mycallee(0, 48, 15)
25: LoadString: 'f' uses: [33]
26: LoadClass: Ljava/lang/StringBuilder;(3), uses: [27]
27: NewInstance: Ljava/lang/StringBuilder;(26, 3), uses: [32, 31, 30, 28]
28: InvokeStaticOrDirect: java.lang.StringBuilder.<init>(27)
29: LoadString: 'result: ' uses: [30]
30: InvokeVirtual: java.lang.StringBuilder.append(27, 29)
31: InvokeVirtual: java.lang.StringBuilder.append(27, 15)
32: InvokeVirtual: java.lang.StringBuilder.toString(27), uses: [33]
33: InvokeStaticOrDirect: android.util.Log.w(25, 32)
35: LoadString: 'caller returns!' uses: [36]
36: InvokeStaticOrDirect: android.util.Log.w(4, 35)
37: ReturnVoid
BasicBlock 2, pred: 1
38: Exit
Replacing 23 and 24 with an arbitrary number of InvokeVirtual instructions only work if the invoked method does not take more arguments than mycallee
. Otherwise, the value of 4 is modified and 36 prints the wrong tag or crashes during runtime.