Skip to content

Commit

Permalink
bir: mutable values and inspection
Browse files Browse the repository at this point in the history
  • Loading branch information
azenla committed Dec 28, 2023
1 parent 962d079 commit 35ce58b
Show file tree
Hide file tree
Showing 36 changed files with 125 additions and 66 deletions.
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrBreak.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrBreak(val target: IrSymbol) : IrCodeElement {
data class IrBreak(var target: IrSymbol) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
Expand Down
8 changes: 4 additions & 4 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrCall.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrCall(
override val target: IrSymbol,
val arguments: List<IrCodeElement>,
val variableArguments: List<IrCodeElement>?
) : IrCodeElement, IrSymbolUser {
override var target: IrSymbol,
var arguments: List<IrCodeElement>,
var variableArguments: List<IrCodeElement>?
) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
arguments.forEach(block)
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrCodeBlock.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrCodeBlock(val items: List<IrCodeElement>) : IrCodeElement {
data class IrCodeBlock(var items: List<IrCodeElement>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
items.forEach(block)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrCodeElement.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
sealed interface IrCodeElement : IrElement
sealed class IrCodeElement : IrElement()
8 changes: 4 additions & 4 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrConditional.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrConditional(
val conditional: IrCodeElement,
val ifTrue: IrCodeElement,
val ifFalse: IrCodeElement
) : IrCodeElement {
var conditional: IrCodeElement,
var ifTrue: IrCodeElement,
var ifFalse: IrCodeElement
) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(conditional)
block(ifTrue)
Expand Down
14 changes: 7 additions & 7 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrConstant.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,24 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
sealed interface IrConstant : IrCodeElement {
sealed class IrConstant : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {}
}

@Serializable
data class IrIntegerConstant(val value: Int) : IrConstant
data class IrIntegerConstant(var value: Int) : IrConstant()

@Serializable
data class IrLongConstant(val value: Long) : IrConstant
data class IrLongConstant(var value: Long) : IrConstant()

@Serializable
data class IrDoubleConstant(val value: Double) : IrConstant
data class IrDoubleConstant(var value: Double) : IrConstant()

@Serializable
data class IrStringConstant(val value: String) : IrConstant
data class IrStringConstant(var value: String) : IrConstant()

@Serializable
data class IrBooleanConstant(val value: Boolean) : IrConstant
data class IrBooleanConstant(var value: Boolean) : IrConstant()

@Serializable
data object IrNoneConstant : IrConstant
data object IrNoneConstant : IrConstant()
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrContinue.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrContinue(override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
data class IrContinue(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrDeclare(override val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolOwner {
data class IrDeclare(override var symbol: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {
value.crawl(block)
}
Expand Down
10 changes: 5 additions & 5 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrDefinition.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrDefinition(
override val symbol: IrSymbol,
val type: IrDefinitionType,
val arguments: List<IrFunctionArgument>,
val code: IrCodeBlock
) : IrElement, IrSymbolOwner {
override var symbol: IrSymbol,
var type: IrDefinitionType,
var arguments: List<IrFunctionArgument>,
var code: IrCodeBlock
) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {
block(symbol)
arguments.forEach(block)
Expand Down
4 changes: 2 additions & 2 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrElement.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
sealed interface IrElement {
fun crawl(block: (IrElement) -> Unit)
sealed class IrElement {
abstract fun crawl(block: (IrElement) -> Unit)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrFunctionArgument(override val symbol: IrSymbol) : IrSymbolOwner {
data class IrFunctionArgument(override var symbol: IrSymbol) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {}
}
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrIndex.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrIndex(val data: IrCodeElement, val index: IrCodeElement) : IrCodeElement {
data class IrIndex(var data: IrCodeElement, var index: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(data)
block(index)
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrInfix.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrInfix(val op: IrInfixOp, val left: IrCodeElement, val right: IrCodeElement) : IrCodeElement {
data class IrInfix(var op: IrInfixOp, var left: IrCodeElement, var right: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(left)
block(right)
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrList.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrList(val items: List<IrCodeElement>) : IrCodeElement {
data class IrList(var items: List<IrCodeElement>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
items.forEach(block)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrListSize.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrListSize(val list: IrCodeElement) : IrCodeElement {
data class IrListSize(var list: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(list)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrLoad.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrLoad(override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
data class IrLoad(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
Expand Down
8 changes: 4 additions & 4 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrLoop.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrLoop(
override val symbol: IrSymbol,
val condition: IrCodeElement,
val inner: IrCodeElement
) : IrCodeElement, IrSymbolOwner {
override var symbol: IrSymbol,
var condition: IrCodeElement,
var inner: IrCodeElement
) : IrCodeElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {
block(symbol)
block(condition)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrNativeDefinition(val form: String, val definitions: List<String>) : IrCodeElement {
data class IrNativeDefinition(var form: String, var definitions: List<String>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {}
}
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrPrefix.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrPrefix(val op: IrPrefixOp, val value: IrCodeElement) : IrCodeElement {
data class IrPrefix(var op: IrPrefixOp, var value: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(value)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrReturn.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrReturn(val from: IrSymbol, val value: IrCodeElement) : IrCodeElement {
data class IrReturn(var from: IrSymbol, var value: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {
block(from)
block(value)
Expand Down
7 changes: 4 additions & 3 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSlab.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrSlab(
val location: IrSlabLocation,
val definitions: List<IrDefinition>
) : IrElement {
override var symbol: IrSymbol,
var location: IrSlabLocation,
var definitions: List<IrDefinition>
) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {
block(location)
definitions.forEach(block)
Expand Down
6 changes: 3 additions & 3 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSlabLocation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable

@Serializable
data class IrSlabLocation(
val form: String,
val path: String
) : IrElement {
var form: String,
var path: String
) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) {}
}
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrStore(override val target: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolUser {
data class IrStore(override var target: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) {
value.crawl(block)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrSuffix.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrSuffix(val op: IrSuffixOp, override val target: IrSymbol) : IrCodeElement, IrSymbolUser {
data class IrSuffix(var op: IrSuffixOp, override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) {
block(target)
}
Expand Down
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbol.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement {
data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) {}

override fun equals(other: Any?): Boolean {
Expand Down
13 changes: 10 additions & 3 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolGraph.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package gay.pizza.pork.bir

import kotlinx.serialization.Serializable

@Serializable(with = IrSymbolGraphSerializer::class)
class IrSymbolGraph {
private val edges = mutableSetOf<Pair<IrSymbolUser, IrSymbolOwner>>()
private val edges = mutableSetOf<IrSymbolGraphEdge>()

private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
if (root is IrSymbolOwner) {
Expand All @@ -17,7 +20,7 @@ class IrSymbolGraph {
if (root is IrSymbolUser) {
val what = known[root.target]
if (what != null) {
edges.add(root to what)
edges.add(IrSymbolGraphEdge(root, what))
}
}

Expand All @@ -26,12 +29,16 @@ class IrSymbolGraph {
}
}

fun crawl(root: IrElement) {
fun buildFromRoot(root: IrElement) {
val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
crawlForKnown(known, root)
crawlForAssociations(known, root)
}

fun buildFromEdges(edges: Collection<IrSymbolGraphEdge>) {
this.edges.addAll(edges)
}

fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
for ((from, to) in edges) {
block(from, to)
Expand Down
6 changes: 6 additions & 0 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolGraphEdge.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package gay.pizza.pork.bir

import kotlinx.serialization.Serializable

@Serializable
data class IrSymbolGraphEdge(val user: IrSymbolUser, val owner: IrSymbolOwner)
26 changes: 26 additions & 0 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolGraphSerializer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package gay.pizza.pork.bir

import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

class IrSymbolGraphSerializer : KSerializer<IrSymbolGraph> {
private val serializer = ListSerializer(IrSymbolGraphEdge.serializer())
override val descriptor: SerialDescriptor = serializer.descriptor

override fun deserialize(decoder: Decoder): IrSymbolGraph {
val graph = IrSymbolGraph()
graph.buildFromEdges(serializer.deserialize(decoder))
return graph
}

override fun serialize(encoder: Encoder, value: IrSymbolGraph) {
val edges = mutableListOf<IrSymbolGraphEdge>()
value.forEachEdge { user, owner ->
edges.add(IrSymbolGraphEdge(user, owner))
}
serializer.serialize(encoder, edges)
}
}
4 changes: 2 additions & 2 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolOwner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
sealed interface IrSymbolOwner : IrElement {
val symbol: IrSymbol
sealed interface IrSymbolOwner {
var symbol: IrSymbol
}
1 change: 1 addition & 0 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolTag.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable

@Serializable
enum class IrSymbolTag {
Slab,
Function,
Variable,
Local,
Expand Down
4 changes: 2 additions & 2 deletions bir/src/main/kotlin/gay/pizza/pork/bir/IrSymbolUser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
sealed interface IrSymbolUser : IrElement {
val target: IrSymbol
sealed interface IrSymbolUser {
var target: IrSymbol
}
2 changes: 1 addition & 1 deletion bir/src/main/kotlin/gay/pizza/pork/bir/IrWorld.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable

@Serializable
data class IrWorld(val slabs: List<IrSlab>) : IrElement {
data class IrWorld(var slabs: List<IrSlab>) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) {
slabs.forEach(block)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import gay.pizza.pork.bir.*
import gay.pizza.pork.frontend.scope.ScopeSymbol
import gay.pizza.pork.frontend.scope.SlabScope

class IrCodeEmitter(
class AstIrEmitter(
val self: IrSymbol,
val irSymbolWorld: IrSymbolWorld<Any>,
val irSymbolAssignment: IrSymbolAssignment,
Expand Down
Loading

0 comments on commit 35ce58b

Please sign in to comment.