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

Reply via email to