Implement a method handle combinator that can be used to synchronize on an
object monitor while executing a given target method handle.
The returned method handle behaves similar to the notional code:
R adapter(Object lock, A... a) throws Throwable {
synchronized (lock) {
return body.invokeExact(a...);
}
}
The lambda form is similar to existing ones: we box up all the arguments for
the body handle, call a fallback function which synchronizes and invokes the
body with the boxed argument, then the `Object` result is fed to an unboxing
handle to unbox the result if needed.
There's a corresponding intrinsic in `InvokerBytecodeGenerator` which replaces
these three operations with `monitorEnter`/`monitorExit` instructions, direct
argument/return value forwarding without (un)boxing, and the necessary
exception handling which makes sure we unlock the lock again in case the body
throws an exception. The generated code is similar to what javac generates.
---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK
Interim AI Policy](https://openjdk.org/legal/ai).
-------------
Commit messages:
- copyright
- remove carriage returns
- Fix comment copy-past-errors
- tweak javadoc
- Add tests + fix bugs
- Add synchro MH combinator
Changes: https://git.openjdk.org/jdk/pull/32817/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=32817&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8163004
Stats: 319 lines in 6 files changed: 313 ins; 0 del; 6 mod
Patch: https://git.openjdk.org/jdk/pull/32817.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/32817/head:pull/32817
PR: https://git.openjdk.org/jdk/pull/32817