From e4406638bd600155c3c296f9fa7ca11d5aa0a7d7 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Mon, 27 Feb 2023 15:56:51 +0100 Subject: [PATCH] [KLIB] Add ZIP file system accessor The accessor interface is used for reading klib archives in place. --- .../konan/file/ZipFileSystemAccessor.kt | 18 ++++++++++++++++++ .../kotlin/library/impl/KotlinLibraryImpl.kt | 19 +++++++++++-------- .../library/impl/KotlinLibraryLayoutImpl.kt | 17 +++++++++-------- 3 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 compiler/util-io/src/org/jetbrains/kotlin/konan/file/ZipFileSystemAccessor.kt diff --git a/compiler/util-io/src/org/jetbrains/kotlin/konan/file/ZipFileSystemAccessor.kt b/compiler/util-io/src/org/jetbrains/kotlin/konan/file/ZipFileSystemAccessor.kt new file mode 100644 index 00000000000..0a95c722129 --- /dev/null +++ b/compiler/util-io/src/org/jetbrains/kotlin/konan/file/ZipFileSystemAccessor.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.konan.file + +import java.nio.file.FileSystem + +interface ZipFileSystemAccessor { + fun withZipFileSystem(zipFile: File, action: (FileSystem) -> T): T +} + +object ZipFileSystemInPlaceAccessor : ZipFileSystemAccessor { + override fun withZipFileSystem(zipFile: File, action: (FileSystem) -> T): T { + return zipFile.withZipFileSystem(action) + } +} diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt index a198772b222..c5ca516f013 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.library.impl import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor import org.jetbrains.kotlin.konan.properties.Properties import org.jetbrains.kotlin.konan.properties.loadProperties import org.jetbrains.kotlin.library.* @@ -322,11 +323,12 @@ fun createKotlinLibrary( libraryFile: File, component: String, isDefault: Boolean = false, - perFile: Boolean = false + perFile: Boolean = false, + zipAccessor: ZipFileSystemAccessor? = null, ): KotlinLibrary { - val baseAccess = BaseLibraryAccess(libraryFile, component) - val metadataAccess = MetadataLibraryAccess(libraryFile, component) - val irAccess = IrLibraryAccess(libraryFile, component) + val baseAccess = BaseLibraryAccess(libraryFile, component, zipAccessor) + val metadataAccess = MetadataLibraryAccess(libraryFile, component, zipAccessor) + val irAccess = IrLibraryAccess(libraryFile, component, zipAccessor) val base = BaseKotlinLibraryImpl(baseAccess, isDefault) val metadata = MetadataLibraryImpl(metadataAccess) @@ -337,12 +339,13 @@ fun createKotlinLibrary( fun createKotlinLibraryComponents( libraryFile: File, - isDefault: Boolean = true -) : List { - val baseAccess = BaseLibraryAccess(libraryFile, null) + isDefault: Boolean = true, + zipAccessor: ZipFileSystemAccessor? = null, +): List { + val baseAccess = BaseLibraryAccess(libraryFile, null, zipAccessor) val base = BaseKotlinLibraryImpl(baseAccess, isDefault) return base.componentList.map { - createKotlinLibrary(libraryFile, it, isDefault) + createKotlinLibrary(libraryFile, it, isDefault, zipAccessor = zipAccessor) } } diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt index ae820e49318..a517454abe4 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt @@ -1,9 +1,6 @@ package org.jetbrains.kotlin.library.impl -import org.jetbrains.kotlin.konan.file.File -import org.jetbrains.kotlin.konan.file.file -import org.jetbrains.kotlin.konan.file.unzipTo -import org.jetbrains.kotlin.konan.file.withZipFileSystem +import org.jetbrains.kotlin.konan.file.* import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.util.removeSuffixIfPresent import java.nio.file.FileSystem @@ -54,9 +51,11 @@ class IrLibraryLayoutImpl(klib: File, component: String) : KotlinLibraryLayoutIm } @Suppress("UNCHECKED_CAST") -open class BaseLibraryAccess(val klib: File, component: String?) { +open class BaseLibraryAccess(val klib: File, component: String?, zipAccessor: ZipFileSystemAccessor? = null) { open val layout = KotlinLibraryLayoutImpl(klib, component) + private val klibZipAccessor = zipAccessor ?: ZipFileSystemInPlaceAccessor + fun realFiles(action: (L) -> T): T = if (layout.isZipped) action(layout.extractingToTemp as L) @@ -65,7 +64,7 @@ open class BaseLibraryAccess(val klib: File, component: fun inPlace(action: (L) -> T): T = if (layout.isZipped) - layout.klib.withZipFileSystem { zipFileSystem -> + klibZipAccessor.withZipFileSystem(layout.klib) { zipFileSystem -> action(layout.directlyFromZip(zipFileSystem) as L) } else @@ -73,11 +72,13 @@ open class BaseLibraryAccess(val klib: File, component: } -class MetadataLibraryAccess(klib: File, component: String) : BaseLibraryAccess(klib, component) { +class MetadataLibraryAccess(klib: File, component: String, zipAccessor: ZipFileSystemAccessor? = null) : + BaseLibraryAccess(klib, component, zipAccessor) { override val layout = MetadataLibraryLayoutImpl(klib, component) } -class IrLibraryAccess(klib: File, component: String) : BaseLibraryAccess(klib, component) { +class IrLibraryAccess(klib: File, component: String, zipAccessor: ZipFileSystemAccessor? = null) : + BaseLibraryAccess(klib, component, zipAccessor) { override val layout = IrLibraryLayoutImpl(klib, component) }