Skip to content

StackOverFlow in CI runner with PrepJSInterop and test_java8 #18334

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
bishabosha opened this issue Aug 3, 2023 · 1 comment · Fixed by #18600
Closed

StackOverFlow in CI runner with PrepJSInterop and test_java8 #18334

bishabosha opened this issue Aug 3, 2023 · 1 comment · Fixed by #18600

Comments

@bishabosha
Copy link
Member

bishabosha commented Aug 3, 2023

Compiler version

ec64ae0
See https://github.com/lampepfl/dotty/actions/runs/5746108750
prompted by failed nightly build #18333

There was a stack overflow error when running PrepJSInterop on tests/run/StringConcat.scala with java 8 (specifically dotty.tools.dotc.ScalaJSCompilationTests.runScalaJS)

Minimized code

// tests/run/StringConcat.scala
@main def Test() = {

  // This should generally obey 15.18.1. of the JLS (String Concatenation Operator +)
  def concatenatingVariousTypes(): String = {
    val str: String = "some string"
    val sb: StringBuffer = new StringBuffer("some stringbuffer")
    val cs: CharSequence = java.nio.CharBuffer.allocate(50).append("charsequence")
    val i: Int = 123456789
    val s: Short = 345
    val b: Byte = 12
    val z: Boolean = true
    val f: Float = 3.5
    val j: Long = 98762147483647L
    val d: Double = 3.1415d

    "String " + str + "\n" +
      "StringBuffer " + sb + "\n" +
      "CharSequence " + cs + "\n" +
      "Int " + i + "\n" +
      "Short " + s + "\n" +
      "Byte " + b + "\n" +
      "Boolean " + z + "\n" +
      "Float " + f + "\n" +
      "Long " + j + "\n" +
      "Double " + d + "\n"
  }
  // The characters `\u0001` and `\u0002` play a special role in `StringConcatFactory`
  def concatenationInvolvingSpecialCharacters(): String = {
    val s1 = "Qux"
    val s2 = "Quux"

    s"Foo \u0001 $s1 Bar \u0002 $s2 Baz"
  }
  // Concatenation involving more than 200 elements
  def largeConcatenation(): String = {
    val s00 = "s00"
    val s01 = "s01"
    val s02 = "s02"
    val s03 = "s03"
    val s04 = "s04"
    val s05 = "s05"
    val s06 = "s06"
    val s07 = "s07"
    val s08 = "s08"

    // 24 rows follow
    ((s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n") +
      (s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n")) +
      ((s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n") +
      (s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n" +
      s00 + "," + s01 + "," + s02 + "," + s03 + "," + s04 + "," + s05 + "," + s06 + "," + s07 + "," + s08 + "\n"))
  }
  println("----------")
  println(concatenatingVariousTypes())
  println("----------")
  println(concatenationInvolvingSpecialCharacters())
  println("----------")
  println(largeConcatenation())
  println("----------")
}

Output (click arrow to expand)

[info] Test dotty.tools.dotc.ScalaJSCompilationTests.runScalaJS started

  unhandled exception while running prepjsinterop on tests/run/StringConcat.scala

  An unhandled exception was thrown in the compiler.
  Please file a crash report here:
  https://github.com/lampepfl/dotty/issues/new/choose

     while compiling: tests/run/StringConcat.scala
        during phase: prepjsinterop
                mode: Mode(ImplicitsEnabled,ReadPositions)
     library version: version 2.13.10
    compiler version: version 3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped-git-ec64ae0
            settings: -Xsemanticdb true -Xunchecked-java-output-version 8 -Xverify-signatures true -Ycheck List(all) -Yforce-sbt-phases true -Yno-deep-subtypes true -Yno-double-bindings true -classpath /root/.cache/coursier/v1/https/scala-webapps.epfl.ch/artifactory/central/org/scala-lang/scala-library/2.13.10/scala-library-2.13.10.jar:/__w/dotty/dotty/library/../out/bootstrap/scala3-library-bootstrapped/scala-3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped/scala3-library_3-3.4.0-RC1-bin-SNAPSHOT.jar:/root/.cache/coursier/v1/https/scala-webapps.epfl.ch/artifactory/central/org/scala-js/scalajs-javalib/1.12.0/scalajs-javalib-1.12.0.jar:/root/.cache/coursier/v1/https/scala-webapps.epfl.ch/artifactory/central/org/scala-js/scalajs-library_2.13/1.12.0/scalajs-library_2.13-1.12.0.jar:/__w/dotty/dotty/library-js/../out/bootstrap/scala3-library-bootstrappedJS/scala-3.4.0-RC1-bin-SNAPSHOT-nonbootstrapped/scala3-library_sjs1_3-3.4.0-RC1-bin-SNAPSHOT.jar:out/runScalaJS/run/StringConcat -color never -d out/runScalaJS/run/StringConcat -indent true -pagewidth 120 -scalajs true
java.lang.StackOverflowError

                tree: EmptyTree
       tree position: :<unknown>
           tree type: <notype>
              symbol: val <none>
           call site: package <root> in module class <root>

  == Source file context for tree position ==


	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1516)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1523)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1529)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1523)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1529)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1523)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1529)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1523)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1529)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1523)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transformStatOrExpr(PrepJSInterop.scala:402)
	at dotty.tools.dotc.transform.sjs.PrepJSInterop$ScalaJSPrepJSInteropTransformer.transform(PrepJSInterop.scala:130)
	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1529)
	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:49)
	at 
@bishabosha bishabosha changed the title StackOverFlow in PrepJSInterop StackOverFlow in PrepJSInterop and Java 8 Aug 3, 2023
@sjrd
Copy link
Member

sjrd commented Aug 3, 2023

That's a pretty deep tree. It probably deserves more stack space.

@bishabosha bishabosha changed the title StackOverFlow in PrepJSInterop and Java 8 StackOverFlow in CI runner with PrepJSInterop and test_java8 Aug 3, 2023
@dwijnand dwijnand linked a pull request Sep 26, 2023 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants