diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fe9c416f0c4..a48545acf76a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -128,12 +128,14 @@ - [Upgraded to Graal VM 21.3.0][3258] - [Added the ability to decorate values with warnings.][3248] - [Fixed issues related to constructors' default arguments][3330] +- [Fixed compiler issue related to module cache.][3367] [3227]: https://github.com/enso-org/enso/pull/3227 [3248]: https://github.com/enso-org/enso/pull/3248 [3258]: https://github.com/enso-org/enso/pull/3258 [3330]: https://github.com/enso-org/enso/pull/3330 [3360]: https://github.com/enso-org/enso/pull/3360 +[3367]: https://github.com/enso-org/enso/pull/3367 # Enso 2.0.0-alpha.18 (2021-10-12) diff --git a/engine/runtime/src/main/scala/org/enso/compiler/ModuleCache.scala b/engine/runtime/src/main/scala/org/enso/compiler/ModuleCache.scala index 452026e16e21..00995a0b7b81 100644 --- a/engine/runtime/src/main/scala/org/enso/compiler/ModuleCache.scala +++ b/engine/runtime/src/main/scala/org/enso/compiler/ModuleCache.scala @@ -1,5 +1,10 @@ package org.enso.compiler +import java.io._ +import java.nio.charset.{Charset, StandardCharsets} +import java.nio.file._ +import java.util.logging.Level + import buildinfo.Info import com.oracle.truffle.api.source.Source import com.oracle.truffle.api.{TruffleFile, TruffleLogger} @@ -14,12 +19,8 @@ import org.enso.interpreter.runtime.builtin.Builtins import org.enso.interpreter.runtime.{Context, Module} import org.enso.logger.masking.MaskedPath -import java.io._ -import java.nio.charset.{Charset, StandardCharsets} -import java.nio.file._ -import java.util.logging.Level import scala.jdk.OptionConverters._ -import scala.util.Using +import scala.util.{Failure, Success, Using} // TODO Once #1971 is fixed, the logging statements should go back to using our // normal templating syntax. @@ -136,10 +137,11 @@ class ModuleCache(private val module: Module) { )(implicit logger: TruffleLogger): Boolean = { if (ensureRoot(cacheRoot)) { val byteStream: ByteArrayOutputStream = new ByteArrayOutputStream() - val stream: ObjectOutputStream = new ObjectOutputStream(byteStream) - stream.writeObject(module.module) - val bytesToWrite = byteStream.toByteArray - stream.close() + val bytesToWrite = + Using.resource(new ObjectOutputStream(byteStream)) { stream => + stream.writeObject(module.module) + byteStream.toByteArray + } val blobDigest = computeDigest(bytesToWrite) val sourceDigest = computeSourceDigest(module.source) @@ -224,14 +226,13 @@ class ModuleCache(private val module: Module) { Module.CompilationStage.valueOf(meta.compilationStage) if (sourceDigestValid && blobDigestValid) { - val bais: ByteArrayInputStream = new ByteArrayInputStream(blobBytes) - val ois: ObjectInputStream = new ObjectInputStream(bais) - - val readObject = ois.readObject() - ois.close() + val readObject = + Using(new ObjectInputStream(new ByteArrayInputStream(blobBytes))) { + _.readObject() + } readObject match { - case mod: IR.Module => + case Success(mod: IR.Module) => Some( ModuleCache.CachedModule( mod, @@ -239,12 +240,19 @@ class ModuleCache(private val module: Module) { module.getSource ) ) - case _ => + case Success(_) => logger.log( ModuleCache.logLevel, s"Module `${module.getName.toString}` was corrupt on disk." ) None + case Failure(ex) => + logger.log( + ModuleCache.logLevel, + s"Module `${module.getName.toString}` failed to load " + + s"(caused by: ${ex.getMessage})." + ) + None } } else { logger.log(