Memory optimization
This commit is contained in:
@@ -40,9 +40,9 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
|
|
||||||
private val explicitlyAddedDescriptors = SmartList<DeclarationDescriptor>()
|
private val explicitlyAddedDescriptors = SmartList<DeclarationDescriptor>()
|
||||||
|
|
||||||
private var functionGroups: MutableMap<Name, SmartList<Int>>? = null
|
private var functionGroups: MutableMap<Name, IntList>? = null
|
||||||
|
|
||||||
private var variableOrClassDescriptors: MutableMap<Name, SmartList<Int>>? = null //TODO: implement SmartIntList
|
private var variableOrClassDescriptors: MutableMap<Name, IntList>? = null
|
||||||
|
|
||||||
private var labelsToDescriptors: MutableMap<Name, SmartList<DeclarationDescriptor>>? = null
|
private var labelsToDescriptors: MutableMap<Name, SmartList<DeclarationDescriptor>>? = null
|
||||||
|
|
||||||
@@ -130,7 +130,8 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
if (variableOrClassDescriptors == null) {
|
if (variableOrClassDescriptors == null) {
|
||||||
variableOrClassDescriptors = HashMap()
|
variableOrClassDescriptors = HashMap()
|
||||||
}
|
}
|
||||||
variableOrClassDescriptors!!.getOrPut(descriptor.getName()) { SmartList() }.add(descriptorIndex)
|
//TODO: could not use += because of KT-8050
|
||||||
|
variableOrClassDescriptors!![name] = variableOrClassDescriptors!![name] + descriptorIndex
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +158,9 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
if (functionGroups == null) {
|
if (functionGroups == null) {
|
||||||
functionGroups = HashMap(1)
|
functionGroups = HashMap(1)
|
||||||
}
|
}
|
||||||
functionGroups!!.getOrPut(functionDescriptor.getName()) { SmartList() }.add(descriptorIndex)
|
val name = functionDescriptor.getName()
|
||||||
|
//TODO: could not use += because of KT-8050
|
||||||
|
functionGroups!![name] = functionGroups!![name] + descriptorIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFunctions(name: Name): Collection<FunctionDescriptor> {
|
override fun getFunctions(name: Name): Collection<FunctionDescriptor> {
|
||||||
@@ -205,23 +208,28 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor> = explicitlyAddedDescriptors
|
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor> = explicitlyAddedDescriptors
|
||||||
|
|
||||||
private fun variableOrClassDescriptorByName(name: Name, descriptorLimit: Int = explicitlyAddedDescriptors.size()): DeclarationDescriptor? {
|
private fun variableOrClassDescriptorByName(name: Name, descriptorLimit: Int = explicitlyAddedDescriptors.size()): DeclarationDescriptor? {
|
||||||
val descriptorIndices = variableOrClassDescriptors?.get(name) ?: return null
|
if (descriptorLimit == 0) return null
|
||||||
for (i in descriptorIndices.indices.reversed()) {
|
|
||||||
val descriptorIndex = descriptorIndices[i]
|
var list = variableOrClassDescriptors?.get(name)
|
||||||
|
while (list != null) {
|
||||||
|
val descriptorIndex = list.head
|
||||||
if (descriptorIndex < descriptorLimit) {
|
if (descriptorIndex < descriptorLimit) {
|
||||||
return descriptorIndex.descriptorByIndex()
|
return descriptorIndex.descriptorByIndex()
|
||||||
}
|
}
|
||||||
|
list = list.tail
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun functionsByName(name: Name, descriptorLimit: Int = explicitlyAddedDescriptors.size()): List<FunctionDescriptor>? {
|
private fun functionsByName(name: Name, descriptorLimit: Int = explicitlyAddedDescriptors.size()): List<FunctionDescriptor>? {
|
||||||
val descriptorIndices = functionGroups?.get(name) ?: return null
|
if (descriptorLimit == 0) return null
|
||||||
for (i in descriptorIndices.indices.reversed()) {
|
|
||||||
val descriptorIndex = descriptorIndices[i]
|
var list = functionGroups?.get(name)
|
||||||
if (descriptorIndex < descriptorLimit) {
|
while (list != null) {
|
||||||
return descriptorIndices.truncated(descriptorIndex + 1).map { it.descriptorByIndex() as FunctionDescriptor }
|
if (list.head < descriptorLimit) {
|
||||||
|
return list.toDescriptors<FunctionDescriptor>()
|
||||||
}
|
}
|
||||||
|
list = list.tail
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@@ -250,8 +258,19 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
p.println("}")
|
p.println("}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class IntList(val head: Int, val tail: IntList?)
|
||||||
|
|
||||||
private fun <T> List<T>.truncated(newSize: Int) = if (newSize == size()) this else subList(0, newSize)
|
private fun IntList?.plus(value: Int) = IntList(value, this)
|
||||||
|
|
||||||
|
private fun <TDescriptor: DeclarationDescriptor> IntList.toDescriptors(): List<TDescriptor> {
|
||||||
|
val result = ArrayList<TDescriptor>(1)
|
||||||
|
var rest: IntList? = this
|
||||||
|
do {
|
||||||
|
result.add(rest!!.head.descriptorByIndex() as TDescriptor)
|
||||||
|
rest = rest.tail
|
||||||
|
} while (rest != null)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
private inner class Snapshot(val descriptorLimit: Int) : JetScope by this@WritableScopeImpl {
|
private inner class Snapshot(val descriptorLimit: Int) : JetScope by this@WritableScopeImpl {
|
||||||
override fun getDescriptors(kindFilter: DescriptorKindFilter,
|
override fun getDescriptors(kindFilter: DescriptorKindFilter,
|
||||||
@@ -297,6 +316,8 @@ public class WritableScopeImpl(outerScope: JetScope,
|
|||||||
|
|
||||||
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor> = explicitlyAddedDescriptors.truncated(descriptorLimit)
|
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor> = explicitlyAddedDescriptors.truncated(descriptorLimit)
|
||||||
|
|
||||||
|
private fun <T> List<T>.truncated(newSize: Int) = if (newSize == size()) this else subList(0, newSize)
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
override fun printScopeStructure(p: Printer) {
|
||||||
p.println(javaClass.getSimpleName(), " {")
|
p.println(javaClass.getSimpleName(), " {")
|
||||||
p.pushIndent()
|
p.pushIndent()
|
||||||
|
|||||||
Reference in New Issue
Block a user