diff --git a/build.mill b/build.mill index bb6e8278..e6ee8a6b 100644 --- a/build.mill +++ b/build.mill @@ -53,9 +53,11 @@ trait SjsonnetCrossModule extends CrossScalaModule with ScalafmtModule { mvn"org.scala-lang.modules::scala-collection-compat::2.14.0" ) - def manifest = super.manifest().add( - "Enable-Native-Access" -> "net.jpountz.util.Native" - ) + def manifest = super + .manifest() + .add( + "Enable-Native-Access" -> "net.jpountz.util.Native" + ) def generatedSources = Task { os.write( diff --git a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala index 00b2af74..11fd2002 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala @@ -213,7 +213,9 @@ object ArrayModule extends AbstractFunctionModule { private object FlattenArrays extends Val.Builtin1("flattenArrays", "arrs") { def evalRhs(arrs: Lazy, ev: EvalScope, pos: Position): Val = { val out = new mutable.ArrayBuilder.ofRef[Lazy] - for (x <- arrs.force.asArr) { + val arr = arrs.force.asArr + out.sizeHint(arr.length * 4) // Rough size hint + for (x <- arr) { x.force match { case Val.Null(_) => // do nothing case v: Val.Arr => out ++= v.asLazyArray @@ -226,9 +228,11 @@ object ArrayModule extends AbstractFunctionModule { private object FlattenDeepArrays extends Val.Builtin1("flattenDeepArray", "value") { def evalRhs(value: Lazy, ev: EvalScope, pos: Position): Val = { + val lazyArray = value.force.asArr.asLazyArray val out = new mutable.ArrayBuilder.ofRef[Lazy] - val q = new java.util.ArrayDeque[Lazy]() - value.force.asArr.asLazyArray.foreach(q.add) + out.sizeHint(lazyArray.length) + val q = new java.util.ArrayDeque[Lazy](lazyArray.length) + lazyArray.foreach(q.add) while (!q.isEmpty) { q.removeFirst().force match { case v: Val.Arr => v.asLazyArray.reverseIterator.foreach(q.push) diff --git a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala index 7f44b316..d7c01dfb 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala @@ -234,6 +234,7 @@ object StringModule extends AbstractFunctionModule { } val b = new mutable.ArrayBuilder.ofRef[Lazy] + b.sizeHint(maxSplits) var sz = 0 var i = 0 var start = 0 @@ -313,8 +314,16 @@ object StringModule extends AbstractFunctionModule { } private object EncodeUTF8 extends Val.Builtin1("encodeUTF8", "str") { - def evalRhs(s: Lazy, ev: EvalScope, pos: Position): Val = - Val.Arr(pos, s.force.asString.getBytes(UTF_8).map(i => Val.Num(pos, i & 0xff))) + def evalRhs(s: Lazy, ev: EvalScope, pos: Position): Val = { + val bytes = s.force.asString.getBytes(UTF_8) + val arr = new Array[Lazy](bytes.length) + var i = 0 + while (i < bytes.length) { + arr(i) = Val.Num(pos, bytes(i) & 0xff) + i += 1 + } + Val.Arr(pos, arr) + } } private object DecodeUTF8 extends Val.Builtin1("decodeUTF8", "arr") {