android 292 - archive.fosdem.org · android 292 mini-interpreter methodhandle.invoke...
TRANSCRIPT
![Page 1: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/1.jpg)
Jérôme Pilliet
Université Paris-Est Marne-la-Vallée
Android 292
![Page 2: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/2.jpg)
2
ForewordsDynamic languages
Semantic determined at runtime
Smartphone / TabletConstraint memoryConstraint computing power
Android and DalvikOS most usedJava technology - Dalvik
![Page 3: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/3.jpg)
3
invokedynamicExample
…o.bar(8)...
.
.
.
. invokevirtual java/lang/Object.bar:(I)V
invokedynamic ''bar'':(Ljava/lang/Object;I)V
class Foo { def bar(a, b=5, c=2:float, d=10) { … }}
![Page 4: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/4.jpg)
4
…invokedynamic "bar" (Ljava/lang/Object;I)V bsm: RT.bsm(Lookup, String, MethodType)CallSite...
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = tree(mh0); return new CallSite(mh1);}
1. call bootstrap method 2. bind a CallSite
// example…o.bar(8);...
bar(8, 5, 2.0, 10)
invokedynamicExample
![Page 5: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/5.jpg)
5
…invokedynamic "bar" (Ljava/lang/Object;I)V bsm: RT.bsm(Lookup, String, MethodType)CallSite...
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = tree(mh0); return new CallSite(mh1);}
bar(8, 5, 2.0, 10)
1. call bootstrap method 2. bind a CallSite
3. next calls
// example…o.bar(8);...
MethodHandlesTree
invokedynamicExample
![Page 6: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/6.jpg)
6
…invokedynamic "bar" (Ljava/lang/Object;I)V bsm: RT.bsm(Lookup, String, MethodType)CallSite...
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = mh0.asType(mType); MethodHandle mh2 = MethodHandles.insertArguments(mh1, 1, 5); MethodHandle mh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); return new ConstantCallSite(mh3);}
bar(8, 5, 2.0, 10)
1. call bootstrap method 2. bind a CallSite
3. next calls
// example…o.bar(8);...
MethodHandlesTree
invokedynamicExample
![Page 7: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/7.jpg)
7
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = mh0.asType(mType); MethodHandle mh2 = MethodHandles.insertArguments(mh1, 1, 5); MethodHandle mh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); return new ConstantCallSite(mh3);}
bar(8) - (I)Vmh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); bar(8,2,10) - (III)V ↳ mh2 = MethodHandles.insertArguments(mh1, 1, 5); bar(8,5,2,10) - (IIII)V
↳ mh1 = mh0.asType(mType); bar(8,5,2.0,10) - (IIFI)V ↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
invokedynamicExample
![Page 8: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/8.jpg)
8
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = mh0.asType(mType); MethodHandle mh2 = MethodHandles.insertArguments(mh1, 1, 5); MethodHandle mh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); return new ConstantCallSite(mh3);}
bar(8) - (I)Vmh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); bar(8,2,10) - (III)V ↳ mh2 = MethodHandles.insertArguments(mh1, 1, 5); bar(8,5,2,10) - (IIII)V
↳ mh1 = mh0.asType(mType); bar(8,5,2.0,10) - (IIFI)V ↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
invokedynamicExample
![Page 9: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/9.jpg)
9
CallSite bsm(Lookup lookup, String name, MethodType mType) { MethodHandle mh0 = lookup.findVirtual(Foo.class, ''bar'', mType); MethodHandle mh1 = mh0.asType(mType); MethodHandle mh2 = MethodHandles.insertArguments(mh1, 1, 5); MethodHandle mh3 = MethodHandles.insertArguments(mh2, 1, 2, 10); return new ConstantCallSite(mh3);}
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
invokedynamicExample
![Page 10: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/10.jpg)
10
JSR 292java.lang.invoke
direct combiner
GuardWithTest insert/bind... ...findStatic
MethodHandle
findVirtual
![Page 11: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/11.jpg)
11
HotspotImplementations
Two different implementationsJDK7:
Interpreter : stubs in assembler + ricochet frame
JIT only constant method handle (static final + invokedynamic)done by generating java code + classical JIT
JDK8 :
Interpreter : written in Java (lambda form)
JIT both invokedynamic and method handledone by generating java code from lambda form + classical JIT
We don't want/can't/think it's a good idea to generate java code
![Page 12: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/12.jpg)
12
Android 292Mini-Interpreter
MethodHandle.invokemh.asType().invokeExact()
mh.asType is a MH tree
invokedynamicCS.getTarget().invokeExact()
MethodHandle.invokeExactMethodHandle direct
direct call, no intermediate stack frameMethodHandle Tree
mini-interpreter
specific calling convention, one specific stack frame
![Page 13: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/13.jpg)
13
Android 292Mini-Interpreter
is a combiner ?mh.invokeExact(...)
javaCall :code = generateCode(mh)
mini-interpretercode exists ?
yes
no
no
yes
direct call
mini_interpreter.execute(code)
![Page 14: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/14.jpg)
14
Move/permute/insert/filter/... stack values in one stack frame
Use an indirection encoded as integers to avoid to move valuesA stack frame of the mini interpreter is known and typed
Do most of the operations on 3 raw types (Object, 32bits, 64bits)Can reuse the same mini-interpreter code for several method handle trees
The mini-interpreter is register based (like Dalvik)No mini-interpreter
Hijack Dalvik interpreter to re-use Dalvik opcodesAdd just one new opcode for the mini-interpreter
Android 292Mini-Interpreter
![Page 15: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/15.jpg)
15
Android 292Data Structures
int nb_r; // number of registersint nb_rv; // number of return values
MethodHandle[] mhs; // list of methodhandlesbyte[] code; // code of methodhandle tree
…
CombinerMethodHandle.java
int bd32; // 32bits bound primitivelong bd64; // 64bits bound primitiveObject bo; // bound object
…
BoundMethodHandle.java
int kind; // invokestatic, invokevirtual, combiner Method* m; // Android raw method pointer int index; // field slot/vtable index
…
MethodHandle.java
![Page 16: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/16.jpg)
16
MethodHandle
Activation HeaderCode Reference (Java)
Return Values(known types)
Registers(32 bits integers)
MH arguments
Stack
a : argumentrv : return value m : methodhandlebd : bound data bo : bound object
32/64bits
Register number representation
Numbers knownon the first execution
Mini Interpreter Program Counter
Android 292Mini-Interpreter Stack Frame
![Page 17: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/17.jpg)
17
Android 292Mini-Interpreter
is a combiner ?mh.invokeExact(...)
mini_interpreter.execute(code)
javaCall :code = generateCode(mh)
yes
no
yes
direct call
mini-interpretercode exists ?
no
![Page 18: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/18.jpg)
18
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 0 nb_rv = 0
Android 292Example
program counter = code + 0
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
0
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
![Page 19: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/19.jpg)
19
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 1 nb_rv = 0
0
a0
Android 292Example
program counter = code + 1
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
![Page 20: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/20.jpg)
20
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 2 nb_rv = 0
0
a0
bd0/32
Android 292Example
program counter = code + 2
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
![Page 21: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/21.jpg)
21
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 3 nb_rv = 0
0
a0bd1/32bd0/32
Android 292Example
program counter = code + 3
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
![Page 22: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/22.jpg)
22
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 4 nb_rv = 0
0
a0bd2/32bd1/32bd0/32
Android 292Example
program counter = code + 6
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
![Page 23: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/23.jpg)
23
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
nb_r = 4 nb_rv = 1
code + 72.0 floata0
bd2/32rv0/32bd0/32
Android 292Example
program counter = code + 8
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
![Page 24: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/24.jpg)
24
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
nb_r = 4 nb_rv = 1
code + 9
Android 292Example
program counter = code + 9
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
2.0 floata0
bd2/32rv0/32bd0/32
![Page 25: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/25.jpg)
25
MethodHandle
Activation Header0x...
8 int
rv
r
a 0
0
123
0code { const r0 a0, const r2 bd0, const r1 bd1, move r3 r2, move r2 r1, const r1 bd2, invoke_mh rv0 m3 r2 1, const r2 rv0, invoke_mh 0 m4 r0 4}
nb_r = 4 nb_rv = 1
Android 292Example
code + 9
program counter = code + 9
bar(8) - (I)Vmh3_2 = MethodHandles.insertArguments(mh3_1, 2, 10); bar(8,10) - (II)V ↳ mh3_1 = MethodHandles.insertArguments(mh2, 1, 2); bar(8,2,10) - (III)V
↳ mh2 = MethodHandles.insertArguments(mh1_1, 1, 5); bar(8,5,2,10) - (IIII)V ↳ mh1_1 = MethodHandles.filterArgument(mh0, 2, i2F); bar(8,5,2.0,10) - (IIFI)V
↳ mh0 = lookup.findVirtual(Foo.class, ''bar'', mType);
mhs = { mh3_2, mh3_1, mh2, mh1_1, mh0 }
2.0 floata0
bd2/32rv0/32bd0/32
![Page 26: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/26.jpg)
26
RoadmapMaster thesis
Prototype with Android 4.0Generation DEX code
Thesis (start sept 2012)Fresh restart with Android 4.2Android SDK compiles with java 7Add instructions : ldc_method*, invokeExact, invokeGeneric …Untainted implementation of java.lang.invoke
No SwitchPoint yet !
Implementation of direct method handle in the interpreterImplementation of the mini interpreter
...Lambda proxy ? (Java 8)
![Page 27: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/27.jpg)
27
GoalDalvik : a ''Java'' VM like the other
Open QuestionsPerf ?Can Hotspot Zero reuse the same scheme ?
Not obvious, java bytecode uses a stack
Can we transform the mini interpreter code to JIT instructions ?
Let say yes, all arguments of the opcodes are known
A specific abstract interpretation should work.
Conclusion
![Page 28: Android 292 - archive.fosdem.org · Android 292 Mini-Interpreter MethodHandle.invoke mh.asType().invokeExact() mh.asType is a MH tree invokedynamic CS.getTarget().invokeExact() MethodHandle.invokeExact](https://reader036.vdocuments.us/reader036/viewer/2022063023/5fffb84523d667287119b8ff/html5/thumbnails/28.jpg)
Jérôme Pilliet<[email protected]>
Université Paris-Est Marne-la-Vallée
Android 292https://bitbucket.org/jpilliet/android-292