On Thu, 12 Jan 2023 17:13:55 GMT, Archie L. Cobbs <[email protected]> wrote:
>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ThisEscapeAnalyzer.java
>> line 411:
>>
>>> 409: final boolean referenceExpressionNode;
>>> 410: switch (tree.getTag()) {
>>> 411: case CASE:
>>
>> surprised to see `CASE` here - as that's not an expression
>
> I put it there because of switch expressions and `yeild`... ?
Well, yield can... yield a value - `case` doesn't. So I'm confused. Also
because the variable is called `referenceExpressionNode` and `CASE` is not an
expression. Can `CASE` leave anything on the stack? YIELD does, but CASE?
>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ThisEscapeAnalyzer.java
>> line 454:
>>
>>> 452:
>>> 453: // If the expression type is incompatible with 'this',
>>> discard it
>>> 454: if (type != null &&
>>> !this.isSubtype(this.targetClass.sym.type, type))
>>
>> Instead of adding the direct reference, and then having to check if the
>> reference needs to be removed, would it be possible not to add the reference
>> in the first place if the types mismatch?
>
> No because (for example) what if you cast?
>
> The thing you're casting might be compatible, but after the cast it might
> become incompatible.
Uhm. Turns out I probably did not understand the filter correctly, and now I'm
more dubious about what it actually does. Say you have this hierarchy:
interface A { }
class B {
B() {
A a = (A)this;
...
}
}
class C extends B implements A { }
```
Pathological case, I know. But the filtering will end up dropping the
expression Ref on the floor, right? (because B and A are unrelated).
-------------
PR: https://git.openjdk.org/jdk/pull/11874