Skip to content

Commit 79c928e

Browse files
committed
perf(dex): per-class ModuleType memo — framework surfaces built once per process
1 parent b50e42f commit 79c928e

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

‎src/jvmMain/kotlin/io/github/dingyi222666/luaparser/interop/jvm/DexClassModelAdapter.kt‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ object DexClassModelAdapter {
9696
)
9797
}
9898

99+
/**
100+
* Per-class ModuleType memo: building a framework class surface (hundreds of
101+
* reflected-style members from the dex) costs seconds on a phone; every
102+
* completion/hover over a dex-typed value re-requests the same class. Keyed
103+
* by binary name; surfaces are immutable so sharing is safe.
104+
*/
105+
private val moduleTypeByBinaryName = java.util.concurrent.ConcurrentHashMap<String, ModuleType>()
106+
107+
fun cachedModuleType(cls: DexClass, dexClasses: Collection<DexClass>): ModuleType =
108+
moduleTypeByBinaryName.computeIfAbsent(cls.binaryName) {
109+
toModuleType(cls, dexClasses)
110+
}
111+
99112
/**
100113
* Adapt one dex class into the provider-shaped module table:
101114
* `__class` (instance shell), `__call` (when constructors exist), public

‎src/jvmMain/kotlin/io/github/dingyi222666/luaparser/interop/jvm/DexLibraryMounter.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ object DexLibraryMounter {
205205
*/
206206
fun moduleTypeFor(cls: DexClass): ModuleType {
207207
moduleTypeCache[cls.binaryName]?.let { return it }
208-
val moduleType = DexClassModelAdapter.toModuleType(cls, classes)
208+
val moduleType = DexClassModelAdapter.cachedModuleType(cls, classes)
209209
moduleTypeCache[cls.binaryName] = moduleType
210210
return moduleType
211211
}

0 commit comments

Comments
 (0)