gpt4 book ai didi

arrays - 为什么大型数组构造函数调用会破坏 Scala 编译器?

转载 作者:行者123 更新时间:2023-12-04 08:06:18 26 4
gpt4 key购买 nike

我正在为一项工作做一些图像处理,并且正在使用 Im4Java 编写脚本。为了编写一些单元案例,我决定在代码中仅将本地镜像存储为字节数组。我抓了一个简单的测试图像

Example Image Pulled from Wikipedia

然后将其转换为字节数组,如下所示:

import java.nio.file.{Paths, Files}
import java.nio.charset.StandardCharsets
val stuff =scala.io.Source.fromFile(fileName)(scala.io.Codec.ISO8859).map(_.toByte).toArray
Files.write(Paths.get("tmp.txt"), stuff.mkString(",").getBytes(StandardCharsets.UTF_8))

然后将这些字节放入 Array[Byte]应用构造函数:
class testCase() {
val smallFile = Array[Byte](-1,-40,-1, …) // 9816 arguments to the constructor passed here
}

当我尝试编译它时(参见 this gist 中的完整 scala 文件),我惊讶地发现它破坏了编译器的打字机!我得到以下堆栈跟踪(我已经截断了一点):
[error] uncaught exception during compilation: java.lang.StackOverflowError
java.lang.StackOverflowError
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1241)
at scala.reflect.internal.Symbols$Symbol.baseTypeSeqLength$1(Symbols.scala:1628)
at scala.reflect.internal.Symbols$Symbol.isLess(Symbols.scala:1631)
at scala.reflect.internal.Types$Type.baseTypeIndex(Types.scala:992)
at scala.reflect.internal.Types$CompoundType.baseType(Types.scala:1655)
at scala.reflect.internal.Types$ClassTypeRef$class.baseType(Types.scala:2186)
at scala.reflect.internal.Types$TypeRef$$anon$6.baseType(Types.scala:2544)
at scala.reflect.internal.Types$class.firstTry$1(Types.scala:6064)
at scala.reflect.internal.Types$class.isSubType2(Types.scala:6228)
at scala.reflect.internal.Types$class.isSubType(Types.scala:5837)
at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:13)
at scala.reflect.internal.Types$class.fourthTry$1(Types.scala:6223)
at scala.reflect.internal.Types$class.thirdTryRef$1(Types.scala:6123)
at scala.reflect.internal.Types$class.thirdTry$1(Types.scala:6145)
at scala.reflect.internal.Types$class.secondTry$1(Types.scala:6109)
at scala.reflect.internal.Types$class.firstTry$1(Types.scala:6070)
at scala.reflect.internal.Types$class.isSubType2(Types.scala:6228)
at scala.reflect.internal.Types$class.isSubType(Types.scala:5837)
at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:13)
at scala.reflect.internal.Types$Type.$less$colon$less(Types.scala:872)
at scala.tools.nsc.typechecker.Typers$Typer.adapt(Typers.scala:1091)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5660)
at scala.tools.nsc.typechecker.Typers$Typer.typedArg(Typers.scala:3042)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3069)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3071)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3071)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3071)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3071)
at scala.tools.nsc.typechecker.Typers$Typer.loop$1(Typers.scala:3071)
(etc as this is where the stackoverflow happens)

我正在使用 Scala 2.10.5 编译器和 java jdk1.7.0_79

我可能只会使用较小的图像或其他东西来解决我的问题,但我想知道编译器为什么会这样做以及是否可以修复?

最佳答案

好吧,我试图重现您的问题,较新的 scalac (2.11.7) 有更好的错误消息(希望它能解决问题):

» scalac Arrays.scala
Arrays.scala:1: error: Could not write class testCase because it exceeds JVM code size limits. Method <init>'s code too large!
class testCase() {
^
one error found

所以看起来就像 @Marius noted in comments ,您达到了 JVM 强加的“每个方法 64K 字节码”的限制。

关于arrays - 为什么大型数组构造函数调用会破坏 Scala 编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31571846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com