Skip to content

Commit 4558431

Browse files
committed
Move the klib zip file accessor configuration to common klib configurations and allow setting the cache size through compiler arguments.
1 parent 99fe570 commit 4558431

File tree

14 files changed

+111
-27
lines changed

14 files changed

+111
-27
lines changed

compiler/arguments/resources/kotlin-compiler-arguments.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6292,6 +6292,37 @@
62926292
"deprecatedVersion": null,
62936293
"removedVersion": null
62946294
}
6295+
},
6296+
{
6297+
"name": "Xklib-zip-file-accessor-cache-limit",
6298+
"shortName": null,
6299+
"deprecatedName": null,
6300+
"description": {
6301+
"current": "Size of cache to be used for the klib zip file accessor. Default is 0.",
6302+
"valueInVersions": []
6303+
},
6304+
"delimiter": null,
6305+
"valueType": {
6306+
"type": "org.jetbrains.kotlin.arguments.dsl.types.IntType",
6307+
"isNullable": {
6308+
"current": false,
6309+
"valueInVersions": []
6310+
},
6311+
"defaultValue": {
6312+
"current": 0,
6313+
"valueInVersions": []
6314+
}
6315+
},
6316+
"valueDescription": {
6317+
"current": null,
6318+
"valueInVersions": []
6319+
},
6320+
"releaseVersionsMetadata": {
6321+
"introducedVersion": "2.1.21",
6322+
"stabilizedVersion": null,
6323+
"deprecatedVersion": null,
6324+
"removedVersion": null
6325+
}
62956326
}
62966327
],
62976328
"nestedLevels": [

compiler/arguments/src/org/jetbrains/kotlin/arguments/description/CommonKlibBasedCompilerArguments.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.arguments.dsl.defaultFalse
1010
import org.jetbrains.kotlin.arguments.dsl.defaultNull
1111
import org.jetbrains.kotlin.arguments.dsl.defaultTrue
1212
import org.jetbrains.kotlin.arguments.dsl.types.BooleanType
13+
import org.jetbrains.kotlin.arguments.dsl.types.IntType
1314
import org.jetbrains.kotlin.arguments.dsl.types.StringArrayType
1415
import org.jetbrains.kotlin.arguments.dsl.types.StringType
1516

@@ -107,4 +108,16 @@ The only observable effect is that a custom ABI version is written to KLIB manif
107108
introducedVersion = KotlinReleaseVersion.v2_2_0,
108109
)
109110
}
111+
112+
compilerArgument {
113+
name = "Xklib-zip-file-accessor-cache-limit"
114+
description = "Size of cache to be used for the klib zip file accessor. Default is 0.".asReleaseDependent()
115+
valueType = IntType(
116+
defaultValue = 0.asReleaseDependent()
117+
)
118+
119+
lifecycle(
120+
introducedVersion = KotlinReleaseVersion.v2_1_21
121+
)
122+
}
110123
}

compiler/arguments/src/org/jetbrains/kotlin/arguments/description/NativeCompilerArguments.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,8 @@ The default value is 1.""".asReleaseDependent()
10691069

10701070
compilerArgument {
10711071
name = "Xmanifest-native-targets"
1072-
description = "Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
1072+
description =
1073+
"Comma-separated list that will be written as the value of 'native_targets' property in the .klib manifest. Unknown values are discarded.".asReleaseDependent()
10731074
valueType = StringArrayType.defaultNull
10741075

10751076
lifecycle(

compiler/build-tools/kotlin-build-tools-api/gen/org/jetbrains/kotlin/buildtools/api/arguments/CommonKlibBasedArguments.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package org.jetbrains.kotlin.buildtools.api.arguments
55

66
import kotlin.Array
77
import kotlin.Boolean
8+
import kotlin.Int
89
import kotlin.String
910
import kotlin.jvm.JvmField
1011

@@ -118,5 +119,15 @@ public interface CommonKlibBasedArguments : CommonCompilerArguments {
118119
@ExperimentalCompilerArgument
119120
public val X_KLIB_ABI_VERSION: CommonKlibBasedArgument<String?> =
120121
CommonKlibBasedArgument("X_KLIB_ABI_VERSION")
122+
123+
/**
124+
* Size of cache to be used for the klib zip file accessor. Default is 0.
125+
*
126+
* WARNING: this option is EXPERIMENTAL and it may be changed in the future without notice or may be removed entirely.
127+
*/
128+
@JvmField
129+
@ExperimentalCompilerArgument
130+
public val X_KLIB_ZIP_FILE_ACCESSOR_CACHE_LIMIT: CommonKlibBasedArgument<Int> =
131+
CommonKlibBasedArgument("X_KLIB_ZIP_FILE_ACCESSOR_CACHE_LIMIT")
121132
}
122133
}

compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/CommonKlibBasedCompilerArguments.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,14 @@ The only observable effect is that a custom ABI version is written to KLIB manif
9595
field = if (value.isNullOrEmpty()) null else value
9696
}
9797

98+
@Argument(
99+
value = "-Xklib-zip-file-accessor-cache-limit",
100+
description = "Size of cache to be used for the klib zip file accessor. Default is 0.",
101+
)
102+
var klibZipFileAccessorCacheLimit: String = "0"
103+
set(value) {
104+
checkFrozen()
105+
field = value
106+
}
107+
98108
}

compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JSCompiler.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.cli.pipeline.web.CommonWebConfigurationUpdater
2929
import org.jetbrains.kotlin.cli.pipeline.web.WebCliPipeline
3030
import org.jetbrains.kotlin.config.CommonConfigurationKeys
3131
import org.jetbrains.kotlin.config.CompilerConfiguration
32+
import org.jetbrains.kotlin.config.KlibConfigurationKeys
3233
import org.jetbrains.kotlin.config.Services
3334
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
3435
import org.jetbrains.kotlin.ir.backend.js.*
@@ -124,7 +125,7 @@ class K2JSCompiler : CLICompiler<K2JSCompilerArguments>() {
124125

125126
val zipAccessor = DisposableZipFileSystemAccessor(64)
126127
Disposer.register(rootDisposable, zipAccessor)
127-
targetEnvironment.configuration.put(JSConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, zipAccessor)
128+
targetEnvironment.configuration.put(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, zipAccessor)
128129

129130
val sourcesFiles = targetEnvironment.getSourceFiles()
130131

compiler/cli/src/org/jetbrains/kotlin/cli/common/klibArguments.kt

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,15 @@
55

66
package org.jetbrains.kotlin.cli.common
77

8+
import com.intellij.openapi.Disposable
89
import org.jetbrains.kotlin.cli.common.arguments.CommonKlibBasedCompilerArguments
910
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
1011
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
12+
import org.jetbrains.kotlin.config.*
1113
import org.jetbrains.kotlin.config.CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS
12-
import org.jetbrains.kotlin.config.CompilerConfiguration
13-
import org.jetbrains.kotlin.config.DuplicatedUniqueNameStrategy
14-
import org.jetbrains.kotlin.config.KlibAbiCompatibilityLevel
15-
import org.jetbrains.kotlin.config.LanguageFeature
16-
import org.jetbrains.kotlin.config.LanguageVersion
17-
import org.jetbrains.kotlin.config.customKlibAbiVersion
18-
import org.jetbrains.kotlin.config.duplicatedUniqueNameStrategy
19-
import org.jetbrains.kotlin.config.klibAbiCompatibilityLevel
20-
import org.jetbrains.kotlin.config.klibNormalizeAbsolutePath
21-
import org.jetbrains.kotlin.config.klibRelativePathBases
22-
import org.jetbrains.kotlin.config.messageCollector
23-
import org.jetbrains.kotlin.config.produceKlibSignaturesClashChecks
14+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
15+
import org.jetbrains.kotlin.konan.file.ZipFileSystemCacheableAccessor
16+
import org.jetbrains.kotlin.konan.file.ZipFileSystemInPlaceAccessor
2417
import org.jetbrains.kotlin.library.KotlinAbiVersion
2518
import java.util.EnumMap
2619
import kotlin.collections.plus
@@ -55,6 +48,8 @@ fun CompilerConfiguration.setupCommonKlibArguments(
5548
if (!isKlibMetadataCompilation) {
5649
setupKlibAbiCompatibilityLevel()
5750
}
51+
52+
zipFileSystemAccessor = getZipFileSystemAccessor(arguments)
5853
}
5954

6055
/**
@@ -76,6 +71,8 @@ fun CompilerConfiguration.copyCommonKlibArgumentsFrom(source: CompilerConfigurat
7671

7772
// ABI compatibility level (the one that actually affects the KLIB serialization).
7873
klibAbiCompatibilityLevel = source.klibAbiCompatibilityLevel
74+
75+
zipFileSystemAccessor = source.zipFileSystemAccessor
7976
}
8077

8178
private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector: MessageCollector): KotlinAbiVersion? {
@@ -99,6 +96,25 @@ private fun parseCustomKotlinAbiVersion(customKlibAbiVersion: String?, collector
9996
return KotlinAbiVersion(version[0], version[1], version[2])
10097
}
10198

99+
private fun getZipFileSystemAccessor(arguments: CommonKlibBasedCompilerArguments): ZipFileSystemAccessor {
100+
val cacheLimit = arguments.klibZipFileAccessorCacheLimit.toIntOrNull()
101+
if (cacheLimit != null && cacheLimit > 0) {
102+
return DisposableZipFileSystemAccessor(cacheLimit)
103+
} else {
104+
return ZipFileSystemInPlaceAccessor
105+
}
106+
}
107+
108+
private class DisposableZipFileSystemAccessor private constructor(
109+
private val zipAccessor: ZipFileSystemCacheableAccessor
110+
) : Disposable, ZipFileSystemAccessor by zipAccessor {
111+
constructor(cacheLimit: Int) : this(ZipFileSystemCacheableAccessor(cacheLimit))
112+
113+
override fun dispose() {
114+
zipAccessor.reset()
115+
}
116+
}
117+
102118
private fun CompilerConfiguration.setupKlibAbiCompatibilityLevel() {
103119
val languageVersionSettings = this[LANGUAGE_VERSION_SETTINGS]
104120
?: error("Language version settings should be already set up")

compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/JsConfigurationKeysContainer.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,6 @@ object JsConfigurationKeysContainer : KeysContainer("org.jetbrains.kotlin.js.con
9898

9999
val GENERATE_STRICT_IMPLICIT_EXPORT by key<Boolean>("enable strict implicitly exported entities types inside d.ts files")
100100

101-
val ZIP_FILE_SYSTEM_ACCESSOR by key<ZipFileSystemAccessor>("zip file system accessor, used for klib reading")
102-
103101
val OPTIMIZE_GENERATED_JS by key<Boolean>("perform additional optimizations on the generated JS code")
104102

105103
val USE_ES6_CLASSES by key<Boolean>("perform ES6 class usage")

compiler/config/configuration-keys-generator/src/org/jetbrains/kotlin/config/keys/generator/KlibConfigurationKeysContainer.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.config.keys.generator
88
import org.jetbrains.kotlin.config.DuplicatedUniqueNameStrategy
99
import org.jetbrains.kotlin.config.KlibAbiCompatibilityLevel
1010
import org.jetbrains.kotlin.config.keys.generator.model.KeysContainer
11+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
1112
import org.jetbrains.kotlin.library.KotlinAbiVersion
1213

1314
@Suppress("unused")
@@ -26,4 +27,6 @@ object KlibConfigurationKeysContainer : KeysContainer("org.jetbrains.kotlin.conf
2627
"KLIB ABI compatibility level",
2728
defaultValue = "KlibAbiCompatibilityLevel.LATEST_STABLE"
2829
)
30+
31+
val ZIP_FILE_SYSTEM_ACCESSOR by key<ZipFileSystemAccessor>("zip file system accessor, used for klib reading")
2932
}

compiler/config/gen/org/jetbrains/kotlin/config/KlibConfigurationKeys.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ package org.jetbrains.kotlin.config
1212
* DO NOT MODIFY IT MANUALLY
1313
*/
1414

15+
import org.jetbrains.kotlin.konan.file.ZipFileSystemAccessor
1516
import org.jetbrains.kotlin.library.KotlinAbiVersion
1617

1718
object KlibConfigurationKeys {
@@ -33,6 +34,9 @@ object KlibConfigurationKeys {
3334
@JvmField
3435
val KLIB_ABI_COMPATIBILITY_LEVEL = CompilerConfigurationKey.create<KlibAbiCompatibilityLevel>("KLIB ABI compatibility level")
3536

37+
@JvmField
38+
val ZIP_FILE_SYSTEM_ACCESSOR = CompilerConfigurationKey.create<ZipFileSystemAccessor>("zip file system accessor, used for klib reading")
39+
3640
}
3741

3842
var CompilerConfiguration.klibRelativePathBases: List<String>
@@ -59,3 +63,7 @@ var CompilerConfiguration.klibAbiCompatibilityLevel: KlibAbiCompatibilityLevel
5963
get() = get(KlibConfigurationKeys.KLIB_ABI_COMPATIBILITY_LEVEL, KlibAbiCompatibilityLevel.LATEST_STABLE)
6064
set(value) { put(KlibConfigurationKeys.KLIB_ABI_COMPATIBILITY_LEVEL, value) }
6165

66+
var CompilerConfiguration.zipFileSystemAccessor: ZipFileSystemAccessor?
67+
get() = get(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR)
68+
set(value) { put(KlibConfigurationKeys.ZIP_FILE_SYSTEM_ACCESSOR, requireNotNull(value) { "nullable values are not allowed" }) }
69+

0 commit comments

Comments
 (0)