RFR: 8354323: Safeguard SwitchBootstraps.typeSwitch when used outside the compiler

Aggelos Biboudis abimpoudis at openjdk.org
Wed May 7 12:02:26 UTC 2025


While the compiler does not allow invalid queries to flow into `SwitchBootstraps:typeSwitch`, a library user could do that and `typeSwitch` does not prevent such usage pattern errors resulting in erroneous evaluation.

For example this is not valid Java (and protected) by javac:


byte b = 1;
switch (b) {
    case String s -> System.out.println("How did we get here? byte is " + s.getClass());
}


but this is a valid call (and not protected):


CallSite shortSwitch = SwitchBootstraps.typeSwitch(
    MethodHandles.lookup(), 
    "", 
    MethodType.methodType(int.class, short.class, int.class),  // models (short, int) -> int
    String.class);


The `SwitchBootstraps.typeSwitch` returns wrong result since the code was reasoning erroneously that this pair was unconditionally exact. 

This PR proposes to add the safety check in unconditional exactness which will return false in erroneous pairs and then the actual check will be delegated to `instanceof`. For the case of erroneous pairs with primitive `boolean`s there is a check in the beginning of the type switch skeleton.

-------------

Commit messages:
 - 8354323: Safeguard SwitchBootstraps.typeSwitch when used outside the compiler

Changes: https://git.openjdk.org/jdk/pull/25090/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25090&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8354323
  Stats: 33 lines in 2 files changed: 27 ins; 0 del; 6 mod
  Patch: https://git.openjdk.org/jdk/pull/25090.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/25090/head:pull/25090

PR: https://git.openjdk.org/jdk/pull/25090


More information about the core-libs-dev mailing list