diff --git a/asm/src/main/java/dev/openrs2/asm/classpath/Library.kt b/asm/src/main/java/dev/openrs2/asm/classpath/Library.kt index 2fb5d281..9aee6005 100644 --- a/asm/src/main/java/dev/openrs2/asm/classpath/Library.kt +++ b/asm/src/main/java/dev/openrs2/asm/classpath/Library.kt @@ -5,8 +5,9 @@ import org.objectweb.asm.commons.Remapper import org.objectweb.asm.tree.ClassNode import java.util.TreeMap -class Library() : Iterable { - private var classes = TreeMap() +class Library(classes: Map = emptyMap()) : Iterable { + + private var classes = TreeMap(classes) constructor(library: Library) : this() { for (clazz in library.classes.values) { diff --git a/asm/src/main/java/dev/openrs2/asm/io/JarLibraryReader.kt b/asm/src/main/java/dev/openrs2/asm/io/JarLibraryReader.kt index a9754db4..65b8d71a 100644 --- a/asm/src/main/java/dev/openrs2/asm/io/JarLibraryReader.kt +++ b/asm/src/main/java/dev/openrs2/asm/io/JarLibraryReader.kt @@ -4,27 +4,29 @@ import dev.openrs2.asm.classpath.JsrInliner import dev.openrs2.asm.classpath.Library import org.objectweb.asm.ClassReader import org.objectweb.asm.tree.ClassNode +import java.util.jar.JarEntry import java.util.jar.JarInputStream class JarLibraryReader(private val input: JarInputStream) : LibraryReader { override fun read(): Library { - val library = Library() + val classes = generateSequence { input.nextJarEntry } + .filter(::isClass) + .map { input.readClass() } + .associateBy(ClassNode::name) - while (true) { - val entry = input.nextJarEntry ?: break - if (!entry.name.endsWith(CLASS_SUFFIX)) { - continue - } - - val clazz = ClassNode() - val reader = ClassReader(input) - reader.accept(JsrInliner(clazz), ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) + return Library(classes) + } - library.add(clazz) - } + private fun isClass(entry: JarEntry): Boolean { + return entry.name.endsWith(CLASS_SUFFIX) + } - return library + private fun JarInputStream.readClass(): ClassNode { + val clazz = ClassNode() + val reader = ClassReader(this) + reader.accept(JsrInliner(clazz), ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES) + return clazz } private companion object {