Skip to content

BUG: Too much AST nesting causes pathological blowup #722

@j-mie6

Description

@j-mie6

I've tried minimising this (reasonably) as much as I can (each step takes ages to test). With SBT set to use 1GB heap, a wiki consisting of the following page (and a small home page, but I'm sure that won't make the difference):

# Bla

@:callout(info)

* Bla

  @:callout(warning)

    * There is a bug that involves nesting and exponential growth:
    
        * ```scala
          val foo = 
              bar <**> Bar(bar)
          ```

          ```scala
          val foo = Bar(bar, "bla" ~> bla <~ "bla")
          ```

          `bar` **baz**.

        * ```scala
          val foo = 
              Bar(bar, "blaaa" ~> bla <~ "bla").label("bar")
          ```

          Bla bla, bla bla bla bla bla, bla bla bla `bla` *bla* bla bla bla.
          Bla bla bla bla bla.

      Bla, bla `Bar` bla bla bla: `bar`;
      bla blabla blabla bla bla bla bla _bla_ bla, bla bla bla bla **bla bla**
      bla bla `bridge` bla bla blabla blablabla.
  @:@

@:@

Will crash with an out of memory error, consuming all 1GB of ram. The stack trace varies as the document size is altered, but the one constant is reference to BlockSource.reverse et al:

java.lang.OutOfMemoryError: Java heap space
        at java.base/java.lang.StringBuilder.toString(StringBuilder.java:475)
        at scala.collection.mutable.StringBuilder.toString(StringBuilder.scala:433)
        at scala.collection.mutable.StringBuilder.result(StringBuilder.scala:449)
        at scala.collection.mutable.StringBuilder.result(StringBuilder.scala:34)
        at scala.collection.IndexedSeqOptimized.reverse(IndexedSeqOptimized.scala:226)
        at scala.collection.IndexedSeqOptimized.reverse$(IndexedSeqOptimized.scala:218)
        at scala.collection.immutable.StringOps.reverse(StringOps.scala:33)
        at laika.parse.LineSource.reverse(SourceCursor.scala:229)
        at laika.parse.BlockSource.$anonfun$reverse$1(SourceCursor.scala:341)
        at laika.parse.BlockSource$$Lambda/0x0000776d75bd0000.apply(Unknown Source)
        at scala.collection.immutable.List.map(List.scala:297)
        at cats.data.Chain.map(Chain.scala:220)
        at cats.data.NonEmptyChainOps$.map$extension(NonEmptyChain.scala:387)
        at laika.parse.BlockSource.reverse(SourceCursor.scala:341)
        at laika.parse.BlockSource.reverse(SourceCursor.scala:292)
        at laika.parse.LineSource.reverse(SourceCursor.scala:229)
        at laika.parse.BlockSource.$anonfun$reverse$1(SourceCursor.scala:341)
        at laika.parse.BlockSource$$Lambda/0x0000776d75bd0000.apply(Unknown Source)
        at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
        at scala.collection.TraversableLike$$Lambda/0x0000776d741c3400.apply(Unknown Source)
        at scala.collection.Iterator.foreach(Iterator.scala:943)
        at scala.collection.Iterator.foreach$(Iterator.scala:943)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
        at scala.collection.IterableLike.foreach(IterableLike.scala:74)
        at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
        at scala.collection.TraversableLike.map(TraversableLike.scala:286)
        at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
        at scala.collection.AbstractTraversable.map(Traversable.scala:108)
        at cats.data.Chain.map(Chain.scala:220)
        at cats.data.NonEmptyChainOps$.map$extension(NonEmptyChain.scala:387)
        at laika.parse.BlockSource.reverse(SourceCursor.scala:341)
[error] [launcher] error during sbt launcher: java.lang.OutOfMemoryError: Java heap space

This seems like a pathological exponential blow up going on.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions