加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:56:02 所属栏目:安全 来源:网络整理
导读:我正在为一份工作做一些图像处理,并用Im4 Java编写脚本.为了编写一些单元格,我决定只将一个本地图像存储为代码中的字节数组.我抓住了一个简单的测试图像 然后将其转换为字节数组,如下所示: import java.nio.file.{Paths,Files}import java.nio.charset.Stan
我正在为一份工作做一些图像处理,并用Im4 Java编写脚本.为了编写一些单元格,我决定只将一个本地图像存储为代码中的字节数组.我抓住了一个简单的测试图像

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] apply构造函数中:

class testCase() {
    val smallFile = Array[Byte](-1,-40,-1,…) // 9816 arguments to the constructor passed here
}

当我尝试编译它时(参见this gist中的完整scala文件)我很惊讶地看到它打破了编译器的大小!我得到以下stacktrace(我已经截断了一点):

[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字节码”的限制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读