diff --git a/README.md b/README.md index 52e2c72..05fc259 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ # jit-broken-switch-example +Original discussion in https://github.com/raphw/byte-buddy/issues/1732 + +ByteBuddy sporadically runs into an "impossible" exception in `net.bytebuddy.dynamic.scaffold.TypeWriter.Default.ValidatingClassVisitor.visitField`. +This code path can happen just with switch statement skipping all branches including default. +In general this condition is rare, but running `org.example.App with` `-Xcomp` reliably reproduces this condition on `Java 18-23`. + + +`Exception in thread "main" java.lang.IllegalStateException: Field POOL_NORMAL defines an incompatible default value 0 +at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ValidatingClassVisitor.visitField(TypeWriter.java:2535) +at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining$WithFullProcessing$RedefinitionClassVisitor.onVisitField(TypeWriter.java:5164) +at net.bytebuddy.utility.visitor.MetadataAwareClassVisitor.visitField(MetadataAwareClassVisitor.java:278) +at net.bytebuddy.jar.asm.ClassVisitor.visitField(ClassVisitor.java:356) +at net.bytebuddy.jar.asm.commons.ClassRemapper.visitField(ClassRemapper.java:169) +at net.bytebuddy.jar.asm.ClassReader.readField(ClassReader.java:1138) +at net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:740) +at net.bytebuddy.utility.AsmClassReader$Default.accept(AsmClassReader.java:132) +at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:4039) +at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2246) +at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$UsingTypeWriter.make(DynamicType.java:4085) +at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3769) +at org.example.App.main(App.java:20)` \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..b3fa399 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,14 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.11.1/userguide/multi_project_builds.html in the Gradle documentation. + */ + +plugins { + // Apply the foojay-resolver plugin to allow automatic download of JDKs + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + +rootProject.name = 'jit-broken-switch-example' +include('app')