[JS IR IC] Do not save metadata to tmp file

Optimization: keep serialized metadata in memory
This commit is contained in:
Alexander Korepanov
2022-12-15 17:44:28 +01:00
committed by Space Team
parent 08a5e36ee7
commit 033ad33322
3 changed files with 20 additions and 20 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.protobuf.CodedOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.OutputStream
internal inline fun <T> File.ifExists(f: File.() -> T): T? = if (exists()) f() else null
@@ -28,14 +29,15 @@ internal inline fun <T> File.useCodedInputIfExists(f: CodedInputStream.() -> T)
}
}
internal inline fun OutputStream.useCodedOutput(f: CodedOutputStream.() -> Unit) = use {
val out = CodedOutputStream.newInstance(it)
out.f()
out.flush()
}
internal inline fun File.useCodedOutput(f: CodedOutputStream.() -> Unit) {
parentFile?.mkdirs()
recreate()
FileOutputStream(this).use {
val out = CodedOutputStream.newInstance(it)
out.f()
out.flush()
}
FileOutputStream(this).useCodedOutput(f)
}
internal fun icError(what: String, libFile: KotlinLibraryFile? = null, srcFile: KotlinSourceFile? = null): Nothing {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.IdSignatureDeserializer
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.protobuf.CodedInputStream
import org.jetbrains.kotlin.protobuf.CodedOutputStream
import java.io.ByteArrayOutputStream
import java.io.File
internal class IncrementalCache(private val library: KotlinLibraryHeader, val cacheDir: File) {
@@ -17,7 +18,6 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca
private const val BINARY_AST_SUFFIX = "ast.bin"
private const val METADATA_SUFFIX = "metadata.bin"
private const val METADATA_TMP_SUFFIX = "metadata.tmp.bin"
}
private val cacheHeaderFile = File(cacheDir, CACHE_HEADER)
@@ -240,11 +240,13 @@ internal class IncrementalCache(private val library: KotlinLibraryHeader, val ca
}
}
val tmpCacheFile = srcFile.getCacheFile(METADATA_TMP_SUFFIX)
tmpCacheFile.useCodedOutput {
writeDirectDependencies(sourceFileMetadata.directDependencies)
writeInverseDependencies(sourceFileMetadata.inverseDependencies)
}
return SourceFileCacheArtifact.CommitMetadata(srcFile, binaryAstFile, headerCacheFile, tmpCacheFile)
val encodedMetadata = ByteArrayOutputStream(4096).apply {
useCodedOutput {
writeDirectDependencies(sourceFileMetadata.directDependencies)
writeInverseDependencies(sourceFileMetadata.inverseDependencies)
}
}.toByteArray()
return SourceFileCacheArtifact.CommitMetadata(srcFile, binaryAstFile, headerCacheFile, encodedMetadata)
}
}
@@ -29,15 +29,11 @@ internal sealed class SourceFileCacheArtifact(val srcFile: KotlinSourceFile, val
srcFile: KotlinSourceFile,
binaryAstFile: File,
private val metadataFile: File,
private val tmpMetadataFile: File
private val encodedMetadata: ByteArray
) : SourceFileCacheArtifact(srcFile, binaryAstFile) {
override fun commitMetadata() {
metadataFile.delete()
if (!tmpMetadataFile.renameTo(metadataFile)) {
tmpMetadataFile.copyTo(metadataFile, true)
tmpMetadataFile.delete()
}
metadataFile.recreate()
metadataFile.writeBytes(encodedMetadata)
}
}