Switch statement in source results in type$1.class being generated?
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri Jul 12 17:23:44 UTC 2019
On 12/07/2019 18:17, Dávid Karnok wrote:
> Hi Maurizio!
>
> Thanks for the clarification. I think I have some explanation why this
> happened. By default, I develop RxJava in Eclipse and eclipsec does
> not generate this file, hence the test was never tripped. I've been
> verifying JDKs with IntelliJ and up until 2019.1.3, the test wasn't
> tripped either because the compiled test classes go into separate
> directory than the main classes and the file was naturally not there.
> With 2019.2, something changed with the compilation and/or output
> settings and now the test could see this $1.class and failed.
>
Btw - these classes have the ACC_SYNTHETHIC flag set - so I guess it
should be possible for your build system to be made more robust and skip
those? After all, if I understand correctly, you want to catch cases
where the library itself is using anon inner classes - and you probably
want to skip whatever helper class compiler XYZ will have generated, right?
Maurizio
> In other words, a bug in the test met with a glitch/bug in the IDE
> made the test work as intended.
>
> Maurizio Cimadamore <maurizio.cimadamore at oracle.com
> <mailto:maurizio.cimadamore at oracle.com>> ezt írta (időpont: 2019. júl.
> 12., P, 16:26):
>
> Hi David,
> javac has been generating 'switchmap' classes for enum switched
> since JDK 5, I believe.
>
> This example:
>
> enum Foo { A, B; }
>
> class TestSwitch {
> int m(Foo foo) {
> switch (foo) {
> case A: return 1;
> case B: return 2;
> default: return -1;
> }
> }
> }
>
> Generates the following classes:
>
> Foo.class
> TestSwitch.class
> TestSwitch$1.class
>
> Where TestSwitch$1.class is similar to the one you have shown. I
> can see this even on JDK 8.
>
> So, I think you might have found a real issue - but I'm not sure
> that this specific synthetic class is the root cause of your
> problem, as this class has been there for a long time.
>
> Maurizio
>
> On 12/07/2019 09:30, Dávid Karnok wrote:
>> Hi.
>>
>> As part of the outreach program, I'm testing the various JDK
>> early access builds with the library RxJava. Now that I can test
>> JDK 13 and JDK 14 by setting a version target in my IDE, I've
>> come across a strange compiler output not encountered with JDK 12
>> and prior versions. Note that RxJava's source code uses Java 6
>> constructs only.
>>
>> One of the rules for RxJava development is that there should be
>> no anonymous inner classes used as it makes analyzing stacktraces
>> with all those $12.class difficult. When the project is compiled,
>> we check for the existence of such type$x.class output and fail
>> the build if found. This worked well up until JDK 12, but now JDK
>> 13 and JDK 14 early accesses generate a couple of such $1.class
>> files. As far as I can tell, they are due to switch statements,
>> for example:
>>
>> https://github.com/akarnokd/RxJava3_BuildMatrix/blob/master/src/main/java/io/reactivex/Observable.java#L14379
>>
>>
>> switch (strategy) {
>> case DROP:
>> return f.onBackpressureDrop();
>> case LATEST:
>> return f.onBackpressureLatest();
>> case MISSING:
>> return f;
>> case ERROR:
>> return RxJavaPlugins.onAssembly(new
>> FlowableOnBackpressureError<T>(f));
>> default:
>> return f.onBackpressureBuffer();
>> }
>>
>> Creates Observable$1.class:
>>
>> javap Observable$1.class
>>
>> Compiled from "Observable.java"
>> class io.reactivex.Observable$1 {
>> static final int[]
>> $SwitchMap$io$reactivex$BackpressureStrategy;
>> static {};
>> }
>>
>> Is this some kind of expected new artifact?
>>
>> --
>> Best regards,
>> David Karnok
>
>
>
> --
> Best regards,
> David Karnok
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20190712/46aa0ec5/attachment-0001.html>
More information about the compiler-dev
mailing list