scala / bug

Scala 2 bug reports only. Please, no questions — proper bug reports only.
https://scala-lang.org
232 stars 21 forks source link

VerifyError: current frame type not assignable to stack map frame type #11294

Closed odd closed 5 years ago

odd commented 5 years ago

While working on adding benchmarks for the new 2.13 collections using JMH, the following error has been encountered:

java.lang.VerifyError: Inconsistent stackmap frames at branch target 72
Exception Details:
  Location:
    StackMapError.f()Lscala/collection/immutable/AbstractSeq; @72: areturn
  Reason:
    Type 'scala/collection/immutable/List' (current frame, stack[0]) is not assignable to 'scala/collection/immutable/AbstractSeq' (stack map, stack[0])
  Current Frame:
    bci: @38
    flags: { }
    locals: { 'StackMapError' }
    stack: { 'scala/collection/immutable/List' }
  Stackmap Frame:
    bci: @72
    flags: { }
    locals: { 'StackMapError' }
    stack: { 'scala/collection/immutable/AbstractSeq' }
  Bytecode:
    0x0000000: 121a 121c b600 2099 0022 b200 26b2 0026
    0x0000010: b200 2b04 bc0a 5903 044f b600 2fb6 0033
    0x0000020: c000 35b6 0039 a700 22b2 003e b600 42b2
    0x0000030: 0026 b200 2b04 bc0a 5903 044f b600 2fb6
    0x0000040: 0033 c000 35b6 0047 b0
  Stackmap Table:
    same_frame(@41)
    same_locals_1_stack_item_frame(@72,Object[#73])

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.openjdk.jmh.generators.reflection.RFClassInfo.getMethods(RFClassInfo.java:99)
    at org.openjdk.jmh.generators.core.BenchmarkGenerator.buildAnnotatedSet(BenchmarkGenerator.java:211)
    at org.openjdk.jmh.generators.core.BenchmarkGenerator.generate(BenchmarkGenerator.java:75)
    at org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator.main(JmhBytecodeGenerator.java:100)
    at pl.project13.scala.sbt.JmhPlugin$.internalGenerateBenchmarkSourcesAndResources(JmhPlugin.scala:125)
    at pl.project13.scala.sbt.JmhPlugin$.$anonfun$generateBenchmarkSourcesAndResources$2(JmhPlugin.scala:108)
    at sbt.util.FileFunction$.$anonfun$cached$1(FileFunction.scala:73)
    at sbt.util.FileFunction$.$anonfun$cached$4(FileFunction.scala:147)
    at sbt.util.Difference.apply(Tracked.scala:313)
    at sbt.util.Difference.apply(Tracked.scala:293)
    at sbt.util.FileFunction$.$anonfun$cached$3(FileFunction.scala:143)
    at sbt.util.Difference.apply(Tracked.scala:313)
    at sbt.util.Difference.apply(Tracked.scala:288)
    at sbt.util.FileFunction$.$anonfun$cached$2(FileFunction.scala:142)
    at pl.project13.scala.sbt.JmhPlugin$.generateBenchmarkSourcesAndResources(JmhPlugin.scala:110)
    at pl.project13.scala.sbt.JmhPlugin$.$anonfun$projectSettings$13(JmhPlugin.scala:66)
    at scala.Function1.$anonfun$compose$1(Function1.scala:44)
    at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
    at sbt.std.Transform$$anon$4.work(System.scala:67)
    at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
    at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
    at sbt.Execute.work(Execute.scala:278)
    at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
    at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

The code causing the error is:

class StackMapError {
  @org.openjdk.jmh.annotations.Param(scala.Array(""))
  var notUsed: String = _

  def f() = {
    if ("x" == "y") List.from(List(1))
    else collection.immutable.ArraySeq.from(List(1))
  }
}

It does not seem to matter which immutable seq sub types that are used; the error occurs as long as immutable.AbstractSeq is a common super type. Using a mutable seq like the following code does not cause the error:

class StackMapError {
  @org.openjdk.jmh.annotations.Param(scala.Array(""))
  var notUsed: String = _

  def f() = {
    if ("x" == "y") List.from(List(1))
    else collection.mutable.ArraySeq.from(List(1))
  }
}

The branching mechanism doesn't matter, the following code causes the same error:

class StackMapError {
  @org.openjdk.jmh.annotations.Param(scala.Array(""))
  var notUsed: String = _

  def f()= {
    "x" match {
      case "y" => List.from(List(1))
      case _ => collection.immutable.ArraySeq.from(List(1))
    }
  }
}

Tested on JVM: 1.8.0_181, 1.8.0_192 Graal, 11/18.9 Scala: 2.13.0-M5 JMH: 1.21

odd commented 5 years ago

@smarter suggested I ping @lrytz for this issue.

odd commented 5 years ago

The same problem as when calling from also occurs when calling empty. The following code causes the error:

  def f()= {
    "x" match {
      case "y" => List.empty[Int]
      case _ => collection.immutable.ArraySeq.empty[Int]
    }
  }

The following code does not cause the error:

  def f()= {
    "x" match {
      case "y" => List.empty[Int]
      case _ => collection.mutable.ArraySeq.empty[Int]
    }
  }
lrytz commented 5 years ago

@odd I couldn't reproduce this by just compiling the method in a separate source file. Could you push a branch somewhere with your changes and let me know what to run to trigger the error?

odd commented 5 years ago

@lrytz I have created https://github.com/odd/scala-stackmaperror, please have a look and see if you can reproduce it there (if not is probably something wrong with my local 2.13.0-M5 jar or something like that...).

lrytz commented 5 years ago

I can reproduce the problem. I'm having a hard time nailing it down though. The error message is

Type scala/collection/immutable/List (current frame, locals[1]) is not assignable to scala/collection/immutable/AbstractSeq

Indeed the stack map frame says

   L3
   FRAME FULL [Failures scala/collection/immutable/AbstractSeq java/lang/String] []

and one of the branches jumping to L3 stores an scala/collection/immutable/List into local variable 1.

The Scala version is set to 2.13.0-M5, and looking at the classfile (unzip /Users/luc/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.0-M5.jar scala/collection/immutable/List.class) I get

public abstract class scala/collection/immutable/List extends scala/collection/immutable/AbstractSeq ...

It seems the error is thrown when jmh is processing classfiles. Running with sbt --debug, I see

Annotation generator had thrown the exception.
java.lang.VerifyError: Inconsistent stackmap frames at branch target 69
...

My wild guess is that there's a different scala-library version on the classpath. I just don't know right now how to debug this further. Maybe @ktoso can help us out?

adriaanm commented 5 years ago

@dwijnand would you have some spare cycles to diagnose / verify Lukas's hypo that the underlying issue is conflicting scala-library jars on the classpath?

dwijnand commented 5 years ago

Hmm, no, and not enough prior knowledge of sbt-jmh or jmh to backfill the lack of cycles.

Another wild guess (less probably) is the scala.List rewrite in the compiler?

adriaanm commented 5 years ago

I can also repro by invoking the given task, but can't repro it programmatically from the console (to further diagnose what the classpath is etc):

I got the values used by doing show etc, but i must be missing some aspect of how the forked classpath is set up. I can't do show failures / Jmh / fullClasspathAsJar without getting the verify error already, so not sure where to look for that

➜  scala-stackmaperror git:(master) ✗ sbt   
[info] Loading settings for project scala-stackmaperror-build from plugins.sbt ...
[info] Loading project definition from /private/tmp/scala-stackmaperror/project
[info] Loading settings for project scala-stackmaperror from build.sbt ...
[info] Set current project to scala-stackmaperror (in build file:/private/tmp/scala-stackmaperror/)
[info] sbt server started at local:///Users/adriaan/.sbt/1.0/server/0f5d1c7e25bb3149770f/sock
sbt:scala-stackmaperror> failures/console
[info] Starting scala interpreter...
Welcome to Scala 2.13.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181).
Type in expressions for evaluation. Or try :help.

scala> val cp =
     |       List("/Users/adriaan/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.0-M5.jar",
     |       "/Users/adriaan/.ivy2/cache/pl.project13.scala/sbt-jmh-extras/jars/sbt-jmh-extras-0.3.4.jar",
     |       "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-core/jars/jmh-core-1.21.jar",
     |       "/Users/adriaan/.ivy2/cache/net.sf.jopt-simple/jopt-simple/jars/jopt-simple-4.6.jar",
     |       "/Users/adriaan/.ivy2/cache/org.apache.commons/commons-math3/jars/commons-math3-3.2.jar", 
     |       "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-bytecode/jars/jmh-generator-bytecode-1.21.jar",
     |       "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-reflection/jars/jmh-generator-reflection-1.21.jar",
     |       "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-asm/jars/jmh-generator-asm-1.21.jar",
     |       "/Users/adriaan/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.3.jar")
cp: List[String] = List(/Users/adriaan/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.0-M5.jar, /Users/adriaan/.ivy2/cache/pl.project13.scala/sbt-jmh-extras/jars/sbt-jmh-extras-0.3.4.jar, /Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-core/jars/jmh-core-1.21.jar, /Users/adriaan/.ivy2/cache/net.sf.jopt-simple/jopt-simple/jars/jopt-simple-4.6.jar, /Users/adriaan/.ivy2/cache/org.apache.commons/commons-math3/jars/commons-math3-3.2.jar, /Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-bytecode/jars/jmh-generator-bytecode-1.21.jar, /Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-reflection/jars/jmh-generator-reflection-1.21.jar, /Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-asm/jars/jmh-generator-asm-1.21.jar, /Users/adriaan/.ivy2/cache/org.ow2.as...

scala> 

scala> 

scala> val bytecodeDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/classes"
bytecodeDir: String = /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/classes

scala> val sourceDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/src_managed"
sourceDir: String = /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/src_managed

scala> val resourceDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/resource_managed/"
resourceDir: String = /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/resource_managed/

scala> 

scala> import org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator
import org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator

scala> import org.openjdk.jmh.annotations.Benchmark
import org.openjdk.jmh.annotations.Benchmark

scala> import scala.tools.nsc.util.ScalaClassLoader.URLClassLoader
import scala.tools.nsc.util.ScalaClassLoader.URLClassLoader

scala> 

scala> 

scala> // rebuild everything -- folders emptied manually

scala> //IO.delete(sourceDir)

scala> //IO.createDirectory(sourceDir)

scala> //IO.delete(resourceDir)

scala> //IO.createDirectory(resourceDir)

scala> 

scala> val bench = classOf[Benchmark]
bench: Class[org.openjdk.jmh.annotations.Benchmark] = interface org.openjdk.jmh.annotations.Benchmark

scala> val loader = new URLClassLoader(cp.map(p => new java.io.File(p).toURI.toURL), bench.getClassLoader)
warning: there was one deprecation warning (since 2.11.0); for details, enable `:setting -deprecation' or `:replay -deprecation'
loader: tools.nsc.util.ScalaClassLoader.URLClassLoader = scala.reflect.internal.util.ScalaClassLoader$URLClassLoader@244f0b2

scala> val old = Thread.currentThread.getContextClassLoader
old: ClassLoader = scala.tools.nsc.interpreter.IMain$TranslatingClassLoader@140137a1

scala> Thread.currentThread.setContextClassLoader(loader)

scala> 

scala> JmhBytecodeGenerator.main(Array(bytecodeDir, sourceDir, resourceDir, "default").map(_.toString))
Processing 1 classes from /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/classes with "reflection" generator
Writing out Java source to /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/src_managed and resources to /tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/resource_managed
adriaanm commented 5 years ago

Ok, I convinced myself it's a classpath problem with the plugin. It has the scala 2.13.0-M5 library as well as the 2.12.7 jars on the classpath.

Painstakingly recreating the classloaders yields:

val cp =
      List("/Users/adriaan/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.13.0-M5.jar",
      "/Users/adriaan/.ivy2/cache/pl.project13.scala/sbt-jmh-extras/jars/sbt-jmh-extras-0.3.4.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-core/jars/jmh-core-1.21.jar",
      "/Users/adriaan/.ivy2/cache/net.sf.jopt-simple/jopt-simple/jars/jopt-simple-4.6.jar",
      "/Users/adriaan/.ivy2/cache/org.apache.commons/commons-math3/jars/commons-math3-3.2.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-bytecode/jars/jmh-generator-bytecode-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-reflection/jars/jmh-generator-reflection-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-asm/jars/jmh-generator-asm-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.3.jar")

val benchCp = List(
      "/Users/adriaan/.ivy2/local/pl.project13.scala/sbt-jmh/scala_2.12/sbt_1.0/0.3.5-SNAPSHOT/jars/sbt-jmh.jar",
      "/Users/adriaan/.ivy2/local/pl.project13.scala/sbt-jmh-extras/0.3.5-local/jars/sbt-jmh-extras.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-core/jars/jmh-core-1.21.jar",
      "/Users/adriaan/.ivy2/cache/net.sf.jopt-simple/jopt-simple/jars/jopt-simple-4.6.jar",
      "/Users/adriaan/.ivy2/cache/org.apache.commons/commons-math3/jars/commons-math3-3.2.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-bytecode/jars/jmh-generator-bytecode-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-reflection/jars/jmh-generator-reflection-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.openjdk.jmh/jmh-generator-asm/jars/jmh-generator-asm-1.21.jar",
      "/Users/adriaan/.ivy2/cache/org.ow2.asm/asm/jars/asm-5.0.3.jar")

val benchParentCp = List(
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/apple-file-events-1.3.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sjson-new-core_2.12-0.8.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/config-1.2.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scalapb-runtime_2.12-0.6.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/log4j-api-2.11.1.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/core-macros_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/gigahorse-core_2.12-0.3.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/main-settings_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/ivy-2.3.0-sbt-b18f59ea3bc914a297bb6f1a4f7fb0ace399e310.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/command_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-ivy-integration_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-control_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/actions_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scripted-plugin_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scala-reflect-2.12.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/tasks_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scripted-sbt-redux_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/slf4j-api-1.7.25.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/collections_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sbinary_2.12-0.5.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/test-interface-1.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/logic_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/log4j-slf4j-impl-2.11.1.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-classpath_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/log4j-core-2.11.1.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-persist_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/ssl-config-core_2.12-0.2.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/jline-2.14.6.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-logging_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/fastparse-utils_2.12-0.4.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/run_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/launcher-interface-1.0.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/compiler-interface-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/protobuf-java-3.3.1.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/protocol_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/io_2.12-1.2.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/reactive-streams-1.0.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sjson-new-scalajson_2.12-0.8.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-apiinfo_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/test-agent-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/okhttp-3.7.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sourcecode_2.12-0.1.3.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/lenses_2.12-0.4.12.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/jna-4.5.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-compile-core_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/okhttp-urlconnection-3.7.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/gigahorse-okhttp_2.12-0.3.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/disruptor-3.4.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/compiler-bridge_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/completion_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-tracking_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/template-resolver-0.1.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/jna-platform-4.5.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-core_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/okio-1.12.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/jawn-parser_2.12-0.10.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/fastparse_2.12-0.4.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-scripted_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/librarymanagement-ivy_2.12-1.2.3.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/jsch-0.1.54.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-position_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sbt-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scalacache-caffeine_2.12-0.20.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-compile_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-relation_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scalacache-core_2.12-0.20.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-interface-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/main_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scala-xml_2.12-1.0.6.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/ipcsocket-1.0.0.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/task-system_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/librarymanagement-core_2.12-1.2.3.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/caffeine-2.5.6.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/zinc-classfile_2.12-1.2.5.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/sjson-new-murmurhash_2.12-0.8.2.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/shaded-scalajson_2.12-1.0.0-M4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/util-cache_2.12-1.2.4.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/testing_2.12-1.2.7.jar",
                              "/Users/adriaan/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/scala-parser-combinators_2.12-1.0.5.jar")

val benchGrandParentCp = List("/Users/adriaan/.sbt/boot/scala-2.12.7/lib/scala-compiler.jar", "/Users/adriaan/.sbt/boot/scala-2.12.7/lib/jline.jar", "/Users/adriaan/.sbt/boot/scala-2.12.7/lib/scala-reflect.jar", "/Users/adriaan/.sbt/boot/scala-2.12.7/lib/scala-xml_2.12.jar")

val bytecodeDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/classes"
val sourceDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/src_managed/jmh"
val resourceDir = "/tmp/scala-stackmaperror/failures/target/scala-2.13.0-M5/resource_managed/jmh"

import org.openjdk.jmh.generators.bytecode.JmhBytecodeGenerator
import scala.tools.nsc.util.ScalaClassLoader.URLClassLoader

val loader = new URLClassLoader(cp.map(p => new java.io.File(p).toURI.toURL),
                                     new java.net.URLClassLoader(benchCp.map(p => new java.io.File(p).toURI.toURL).toArray, new java.net.URLClassLoader(benchParentCp.map(p => new java.io.File(p).toURI.toURL).toArray, new java.net.URLClassLoader(benchGrandParentCp.map(p => new java.io.File(p).toURI.toURL).toArray, null))))
Thread.currentThread.setContextClassLoader(loader)

JmhBytecodeGenerator.main(Array(bytecodeDir, sourceDir, resourceDir, "default").map(_.toString))