From 19424abe2818be9b8973197ab1af786ab2c20856 Mon Sep 17 00:00:00 2001 From: Smallhacker Date: Fri, 18 Jan 2019 22:51:37 +0100 Subject: [PATCH] Removed a few JDK dependencies --- .../smallhacker/disbrowser/asm/MemorySpace.kt | 2 -- .../com/smallhacker/disbrowser/asm/Opcode.kt | 2 -- .../smallhacker/disbrowser/asm/SnesMemory.kt | 7 ++----- .../disbrowser/disassembler/Disassembler.kt | 20 +++++++++---------- .../smallhacker/disbrowser/game/GameSource.kt | 4 +++- .../smallhacker/disbrowser/util/ItemQueue.kt | 14 +++++++++++++ .../com/smallhacker/disbrowser/util/UVal.kt | 4 +--- .../com/smallhacker/disbrowser/util/misc.kt | 10 ++++++++++ 8 files changed, 40 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/smallhacker/disbrowser/util/ItemQueue.kt diff --git a/src/main/java/com/smallhacker/disbrowser/asm/MemorySpace.kt b/src/main/java/com/smallhacker/disbrowser/asm/MemorySpace.kt index b1de980..b33ae74 100644 --- a/src/main/java/com/smallhacker/disbrowser/asm/MemorySpace.kt +++ b/src/main/java/com/smallhacker/disbrowser/asm/MemorySpace.kt @@ -4,8 +4,6 @@ import com.smallhacker.disbrowser.util.UInt24 import com.smallhacker.disbrowser.util.joinBytes import com.smallhacker.disbrowser.util.joinNullableBytes import com.smallhacker.disbrowser.util.toUInt24 -import java.nio.file.Files -import java.nio.file.Path interface MemorySpace { val size: UInt diff --git a/src/main/java/com/smallhacker/disbrowser/asm/Opcode.kt b/src/main/java/com/smallhacker/disbrowser/asm/Opcode.kt index 624e2ed..eec6dbc 100644 --- a/src/main/java/com/smallhacker/disbrowser/asm/Opcode.kt +++ b/src/main/java/com/smallhacker/disbrowser/asm/Opcode.kt @@ -1,7 +1,5 @@ package com.smallhacker.disbrowser.asm -import java.util.HashMap - import com.smallhacker.disbrowser.asm.Mnemonic.* typealias SegmentEnder = Instruction.() -> SegmentEnd? diff --git a/src/main/java/com/smallhacker/disbrowser/asm/SnesMemory.kt b/src/main/java/com/smallhacker/disbrowser/asm/SnesMemory.kt index f5f1e78..a3cdc95 100644 --- a/src/main/java/com/smallhacker/disbrowser/asm/SnesMemory.kt +++ b/src/main/java/com/smallhacker/disbrowser/asm/SnesMemory.kt @@ -3,8 +3,6 @@ package com.smallhacker.disbrowser.asm import com.smallhacker.disbrowser.datatype.MutableRangeMap import com.smallhacker.disbrowser.datatype.NaiveRangeMap import com.smallhacker.disbrowser.util.toUInt24 -import java.nio.file.Files -import java.nio.file.Path abstract class SnesMemory: MemorySpace { override val size = 0x100_0000u @@ -28,9 +26,8 @@ abstract class SnesMemory: MemorySpace { } companion object { - fun loadRom(path: Path): SnesMemory { - val bytes = Files.readAllBytes(path).toUByteArray() - val romSpace = ArrayMemorySpace(bytes) + fun loadRom(fileData: UByteArray): SnesMemory { + val romSpace = ArrayMemorySpace(fileData) // TODO: Auto-detect ROM type return SnesLoRom(romSpace) } diff --git a/src/main/java/com/smallhacker/disbrowser/disassembler/Disassembler.kt b/src/main/java/com/smallhacker/disbrowser/disassembler/Disassembler.kt index 5fa94d9..0a03266 100644 --- a/src/main/java/com/smallhacker/disbrowser/disassembler/Disassembler.kt +++ b/src/main/java/com/smallhacker/disbrowser/disassembler/Disassembler.kt @@ -2,16 +2,16 @@ package com.smallhacker.disbrowser.disassembler import com.smallhacker.disbrowser.asm.* import com.smallhacker.disbrowser.game.* +import com.smallhacker.disbrowser.util.LifoQueue import com.smallhacker.disbrowser.util.mutableMultiMap import com.smallhacker.disbrowser.util.putSingle -import java.util.* import kotlin.collections.ArrayList import kotlin.collections.HashMap object Disassembler { fun disassemble(initialState: State, gameData: GameData, global: Boolean): Disassembly { val seen = HashSet() - val queue = ArrayDeque() + val queue = LifoQueue() val origins = mutableMultiMap() val instructionMap = HashMap() @@ -27,7 +27,7 @@ object Disassembler { val instructions = ArrayList() while (queue.isNotEmpty()) { - val state = queue.remove() + val state = queue.removeNext() val ins = disassembleInstruction(state) instructions.add(ins) @@ -98,10 +98,10 @@ object Disassembler { } val fatalSeen = HashSet() - val fatalQueue = ArrayDeque() + val fatalQueue = LifoQueue() fun tryAddFatal(snesAddress: SnesAddress) { if (fatalSeen.add(snesAddress)) { - fatalQueue.addLast(snesAddress) + fatalQueue.add(snesAddress) } } @@ -111,7 +111,7 @@ object Disassembler { .forEach { tryAddFatal(it.address) } while (fatalQueue.isNotEmpty()) { - val badAddress = fatalQueue.removeFirst()!! + val badAddress = fatalQueue.removeNext()!! val instruction = instructionMap[badAddress] ?: continue val mnemonic = instruction.opcode.mnemonic if (mnemonic == Mnemonic.JSL || mnemonic == Mnemonic.JSR) continue @@ -128,7 +128,7 @@ object Disassembler { fun disassembleSegments(initialState: State): List { val mapping = HashMap() - val queue = ArrayDeque() + val queue = LifoQueue() val segments = ArrayList() @@ -141,7 +141,7 @@ object Disassembler { while (queue.isNotEmpty()) { - val state = queue.remove() + val state = queue.removeNext() if (mapping.containsKey(state.address)) { continue @@ -169,7 +169,7 @@ object Disassembler { val instructions = ArrayList() var lastState = initialState - val queue = ArrayDeque() + val queue = LifoQueue() val seen = HashSet() fun finalize(segment: Segment): Segment { @@ -187,7 +187,7 @@ object Disassembler { tryAdd(initialState) while (queue.isNotEmpty()) { - val state = queue.remove() + val state = queue.removeNext() val ins = disassembleInstruction(state) instructions.add(ins) diff --git a/src/main/java/com/smallhacker/disbrowser/game/GameSource.kt b/src/main/java/com/smallhacker/disbrowser/game/GameSource.kt index d150762..93348b6 100644 --- a/src/main/java/com/smallhacker/disbrowser/game/GameSource.kt +++ b/src/main/java/com/smallhacker/disbrowser/game/GameSource.kt @@ -3,6 +3,7 @@ package com.smallhacker.disbrowser.game import com.smallhacker.disbrowser.asm.SnesMemory import com.smallhacker.disbrowser.util.jsonFile import org.glassfish.jersey.server.ResourceConfig +import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.util.concurrent.ConcurrentHashMap @@ -34,7 +35,8 @@ class GameSource(private val gameDataDir: Path) { val gameData = gameDataJsonFile.load() val gamePath = Paths.get(gameData.path) - val rom = SnesMemory.loadRom(gamePath) + val romData = Files.readAllBytes(gamePath).toUByteArray() + val rom = SnesMemory.loadRom(romData) Game(name, rom, gameData, gameDataJsonFile) } catch (e: Exception) { e.printStackTrace() diff --git a/src/main/java/com/smallhacker/disbrowser/util/ItemQueue.kt b/src/main/java/com/smallhacker/disbrowser/util/ItemQueue.kt new file mode 100644 index 0000000..f629640 --- /dev/null +++ b/src/main/java/com/smallhacker/disbrowser/util/ItemQueue.kt @@ -0,0 +1,14 @@ +package com.smallhacker.disbrowser.util + +// The Kotlin standard library does not contain a counterpart to Java's ArrayDeque, so let's implement a simplistic +// one ourselves for portability. + +interface ItemQueue : MutableCollection { + fun removeNext(): E +} + +class LifoQueue private constructor(private val list: MutableList) : ItemQueue, MutableCollection by list { + constructor() : this(ArrayList()) + + override fun removeNext(): E = list.removeAt(0) +} \ No newline at end of file diff --git a/src/main/java/com/smallhacker/disbrowser/util/UVal.kt b/src/main/java/com/smallhacker/disbrowser/util/UVal.kt index 666ef83..c7b7d8c 100644 --- a/src/main/java/com/smallhacker/disbrowser/util/UVal.kt +++ b/src/main/java/com/smallhacker/disbrowser/util/UVal.kt @@ -1,7 +1,5 @@ package com.smallhacker.disbrowser.util -import java.util.* - abstract class UType(val bytes: Int, val name: String) { val mask = (1 shl (bytes * 8)) - 1 } @@ -22,7 +20,7 @@ class UVal(value: Int, val type: U) : Comparable> { override fun compareTo(other: UVal): Int = Integer.compare(value, other.value) - override fun hashCode() = Objects.hash(value, type) + override fun hashCode() = hashOf(value, type) //fun value(value: Int) = UVal(value, type) //fun mutate(mutator: (Int) -> Int) = UVal(mutator(value), type) diff --git a/src/main/java/com/smallhacker/disbrowser/util/misc.kt b/src/main/java/com/smallhacker/disbrowser/util/misc.kt index 21c7695..2288bf9 100644 --- a/src/main/java/com/smallhacker/disbrowser/util/misc.kt +++ b/src/main/java/com/smallhacker/disbrowser/util/misc.kt @@ -86,4 +86,14 @@ fun MutableMap.removeIf(condition: (K, V) -> Boolean) { .map { it.key } .toList() .forEach { remove(it) } +} + +fun hashOf(vararg values: Any?): Int { + return if (values.isEmpty()) { + 0 + } else { + values.asSequence() + .map { it.hashCode() } + .reduce { acc, v -> (acc * 31) + v } + } } \ No newline at end of file