MethodHandles: change asType() / invoke() implementation
This CL changes how we deal with non-exact invokes and asType().
Specifically:
1. It drops the concept of `nominalType` from our implementation and
adds an AsTypeAdapter transformer for performing pairwise
conversions. This means asType() conversions are orthogonal to other
transforms and easier to reason about.
2. It switches to use the asTypeCache to reduce the cost of non-exact
invokes.
3. It adds MethodType::IsInPlaceConvertible in the fast-path for
MethodHandle.invoke() to avoid an asTypeAdapter transformer when the
required conversions can be performed in-place with no-ops. This is
possible because the ShadowFrame deals in 32-bit vregs so
conversions like byte -> int are no-ops.
Bug: 207844518
Test: art/test.py --host
Test: atest CtsLibcoreTestCases
Change-Id: I2faf260b164767104c7ae0bc061fbf4f6579bbff
12 files changed