mirror of
				https://github.com/GayPizzaSpecifications/pork.git
				synced 2025-11-03 17:39:38 +00:00 
			
		
		
		
	bir: mutable values and inspection
This commit is contained in:
		@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrBreak(val target: IrSymbol) : IrCodeElement {
 | 
					data class IrBreak(var target: IrSymbol) : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(target)
 | 
					    block(target)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrCall(
 | 
					data class IrCall(
 | 
				
			||||||
  override val target: IrSymbol,
 | 
					  override var target: IrSymbol,
 | 
				
			||||||
  val arguments: List<IrCodeElement>,
 | 
					  var arguments: List<IrCodeElement>,
 | 
				
			||||||
  val variableArguments: List<IrCodeElement>?
 | 
					  var variableArguments: List<IrCodeElement>?
 | 
				
			||||||
) : IrCodeElement, IrSymbolUser {
 | 
					) : IrCodeElement(), IrSymbolUser {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(target)
 | 
					    block(target)
 | 
				
			||||||
    arguments.forEach(block)
 | 
					    arguments.forEach(block)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrCodeBlock(val items: List<IrCodeElement>) : IrCodeElement {
 | 
					data class IrCodeBlock(var items: List<IrCodeElement>) : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    items.forEach(block)
 | 
					    items.forEach(block)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,4 +3,4 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
sealed interface IrCodeElement : IrElement
 | 
					sealed class IrCodeElement : IrElement()
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrConditional(
 | 
					data class IrConditional(
 | 
				
			||||||
  val conditional: IrCodeElement,
 | 
					  var conditional: IrCodeElement,
 | 
				
			||||||
  val ifTrue: IrCodeElement,
 | 
					  var ifTrue: IrCodeElement,
 | 
				
			||||||
  val ifFalse: IrCodeElement
 | 
					  var ifFalse: IrCodeElement
 | 
				
			||||||
) : IrCodeElement {
 | 
					) : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(conditional)
 | 
					    block(conditional)
 | 
				
			||||||
    block(ifTrue)
 | 
					    block(ifTrue)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,24 +3,24 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
sealed interface IrConstant : IrCodeElement {
 | 
					sealed class IrConstant : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {}
 | 
					  override fun crawl(block: (IrElement) -> Unit) {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrIntegerConstant(val value: Int) : IrConstant
 | 
					data class IrIntegerConstant(var value: Int) : IrConstant()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrLongConstant(val value: Long) : IrConstant
 | 
					data class IrLongConstant(var value: Long) : IrConstant()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrDoubleConstant(val value: Double) : IrConstant
 | 
					data class IrDoubleConstant(var value: Double) : IrConstant()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrStringConstant(val value: String) : IrConstant
 | 
					data class IrStringConstant(var value: String) : IrConstant()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrBooleanConstant(val value: Boolean) : IrConstant
 | 
					data class IrBooleanConstant(var value: Boolean) : IrConstant()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data object IrNoneConstant : IrConstant
 | 
					data object IrNoneConstant : IrConstant()
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(target)
 | 
					    block(target)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    value.crawl(block)
 | 
					    value.crawl(block)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -4,11 +4,11 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrDefinition(
 | 
					data class IrDefinition(
 | 
				
			||||||
  override val symbol: IrSymbol,
 | 
					  override var symbol: IrSymbol,
 | 
				
			||||||
  val type: IrDefinitionType,
 | 
					  var type: IrDefinitionType,
 | 
				
			||||||
  val arguments: List<IrFunctionArgument>,
 | 
					  var arguments: List<IrFunctionArgument>,
 | 
				
			||||||
  val code: IrCodeBlock
 | 
					  var code: IrCodeBlock
 | 
				
			||||||
) : IrElement, IrSymbolOwner {
 | 
					) : IrElement(), IrSymbolOwner {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(symbol)
 | 
					    block(symbol)
 | 
				
			||||||
    arguments.forEach(block)
 | 
					    arguments.forEach(block)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
sealed interface IrElement {
 | 
					sealed class IrElement {
 | 
				
			||||||
  fun crawl(block: (IrElement) -> Unit)
 | 
					  abstract fun crawl(block: (IrElement) -> Unit)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {}
 | 
					  override fun crawl(block: (IrElement) -> Unit) {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(data)
 | 
					    block(data)
 | 
				
			||||||
    block(index)
 | 
					    block(index)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(left)
 | 
					    block(left)
 | 
				
			||||||
    block(right)
 | 
					    block(right)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrList(val items: List<IrCodeElement>) : IrCodeElement {
 | 
					data class IrList(var items: List<IrCodeElement>) : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    items.forEach(block)
 | 
					    items.forEach(block)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrListSize(val list: IrCodeElement) : IrCodeElement {
 | 
					data class IrListSize(var list: IrCodeElement) : IrCodeElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(list)
 | 
					    block(list)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(target)
 | 
					    block(target)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrLoop(
 | 
					data class IrLoop(
 | 
				
			||||||
  override val symbol: IrSymbol,
 | 
					  override var symbol: IrSymbol,
 | 
				
			||||||
  val condition: IrCodeElement,
 | 
					  var condition: IrCodeElement,
 | 
				
			||||||
  val inner: IrCodeElement
 | 
					  var inner: IrCodeElement
 | 
				
			||||||
) : IrCodeElement, IrSymbolOwner {
 | 
					) : IrCodeElement(), IrSymbolOwner {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(symbol)
 | 
					    block(symbol)
 | 
				
			||||||
    block(condition)
 | 
					    block(condition)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {}
 | 
					  override fun crawl(block: (IrElement) -> Unit) {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(value)
 | 
					    block(value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(from)
 | 
					    block(from)
 | 
				
			||||||
    block(value)
 | 
					    block(value)
 | 
				
			||||||
 | 
				
			|||||||
@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrSlab(
 | 
					data class IrSlab(
 | 
				
			||||||
  val location: IrSlabLocation,
 | 
					  override var symbol: IrSymbol,
 | 
				
			||||||
  val definitions: List<IrDefinition>
 | 
					  var location: IrSlabLocation,
 | 
				
			||||||
) : IrElement {
 | 
					  var definitions: List<IrDefinition>
 | 
				
			||||||
 | 
					) : IrElement(), IrSymbolOwner {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(location)
 | 
					    block(location)
 | 
				
			||||||
    definitions.forEach(block)
 | 
					    definitions.forEach(block)
 | 
				
			||||||
 | 
				
			|||||||
@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrSlabLocation(
 | 
					data class IrSlabLocation(
 | 
				
			||||||
  val form: String,
 | 
					  var form: String,
 | 
				
			||||||
  val path: String
 | 
					  var path: String
 | 
				
			||||||
) : IrElement {
 | 
					) : IrElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {}
 | 
					  override fun crawl(block: (IrElement) -> Unit) {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    value.crawl(block)
 | 
					    value.crawl(block)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    block(target)
 | 
					    block(target)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@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 crawl(block: (IrElement) -> Unit) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,10 @@
 | 
				
			|||||||
package gay.pizza.pork.bir
 | 
					package gay.pizza.pork.bir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Serializable(with = IrSymbolGraphSerializer::class)
 | 
				
			||||||
class IrSymbolGraph {
 | 
					class IrSymbolGraph {
 | 
				
			||||||
  private val edges = mutableSetOf<Pair<IrSymbolUser, IrSymbolOwner>>()
 | 
					  private val edges = mutableSetOf<IrSymbolGraphEdge>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
 | 
					  private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
 | 
				
			||||||
    if (root is IrSymbolOwner) {
 | 
					    if (root is IrSymbolOwner) {
 | 
				
			||||||
@ -17,7 +20,7 @@ class IrSymbolGraph {
 | 
				
			|||||||
    if (root is IrSymbolUser) {
 | 
					    if (root is IrSymbolUser) {
 | 
				
			||||||
      val what = known[root.target]
 | 
					      val what = known[root.target]
 | 
				
			||||||
      if (what != null) {
 | 
					      if (what != null) {
 | 
				
			||||||
        edges.add(root to what)
 | 
					        edges.add(IrSymbolGraphEdge(root, what))
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,12 +29,16 @@ class IrSymbolGraph {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun crawl(root: IrElement) {
 | 
					  fun buildFromRoot(root: IrElement) {
 | 
				
			||||||
    val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
 | 
					    val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
 | 
				
			||||||
    crawlForKnown(known, root)
 | 
					    crawlForKnown(known, root)
 | 
				
			||||||
    crawlForAssociations(known, root)
 | 
					    crawlForAssociations(known, root)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fun buildFromEdges(edges: Collection<IrSymbolGraphEdge>) {
 | 
				
			||||||
 | 
					    this.edges.addAll(edges)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
 | 
					  fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
 | 
				
			||||||
    for ((from, to) in edges) {
 | 
					    for ((from, to) in edges) {
 | 
				
			||||||
      block(from, to)
 | 
					      block(from, to)
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					package gay.pizza.pork.bir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Serializable
 | 
				
			||||||
 | 
					data class IrSymbolGraphEdge(val user: IrSymbolUser, val owner: IrSymbolOwner)
 | 
				
			||||||
@ -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)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
sealed interface IrSymbolOwner : IrElement {
 | 
					sealed interface IrSymbolOwner {
 | 
				
			||||||
  val symbol: IrSymbol
 | 
					  var symbol: IrSymbol
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
enum class IrSymbolTag {
 | 
					enum class IrSymbolTag {
 | 
				
			||||||
 | 
					  Slab,
 | 
				
			||||||
  Function,
 | 
					  Function,
 | 
				
			||||||
  Variable,
 | 
					  Variable,
 | 
				
			||||||
  Local,
 | 
					  Local,
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,6 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
sealed interface IrSymbolUser : IrElement {
 | 
					sealed interface IrSymbolUser {
 | 
				
			||||||
  val target: IrSymbol
 | 
					  var target: IrSymbol
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ package gay.pizza.pork.bir
 | 
				
			|||||||
import kotlinx.serialization.Serializable
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
data class IrWorld(val slabs: List<IrSlab>) : IrElement {
 | 
					data class IrWorld(var slabs: List<IrSlab>) : IrElement() {
 | 
				
			||||||
  override fun crawl(block: (IrElement) -> Unit) {
 | 
					  override fun crawl(block: (IrElement) -> Unit) {
 | 
				
			||||||
    slabs.forEach(block)
 | 
					    slabs.forEach(block)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ import gay.pizza.pork.bir.*
 | 
				
			|||||||
import gay.pizza.pork.frontend.scope.ScopeSymbol
 | 
					import gay.pizza.pork.frontend.scope.ScopeSymbol
 | 
				
			||||||
import gay.pizza.pork.frontend.scope.SlabScope
 | 
					import gay.pizza.pork.frontend.scope.SlabScope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class IrCodeEmitter(
 | 
					class AstIrEmitter(
 | 
				
			||||||
  val self: IrSymbol,
 | 
					  val self: IrSymbol,
 | 
				
			||||||
  val irSymbolWorld: IrSymbolWorld<Any>,
 | 
					  val irSymbolWorld: IrSymbolWorld<Any>,
 | 
				
			||||||
  val irSymbolAssignment: IrSymbolAssignment,
 | 
					  val irSymbolAssignment: IrSymbolAssignment,
 | 
				
			||||||
@ -4,6 +4,7 @@ import gay.pizza.pork.ast.gen.Symbol
 | 
				
			|||||||
import gay.pizza.pork.bir.IrDefinition
 | 
					import gay.pizza.pork.bir.IrDefinition
 | 
				
			||||||
import gay.pizza.pork.bir.IrSlab
 | 
					import gay.pizza.pork.bir.IrSlab
 | 
				
			||||||
import gay.pizza.pork.bir.IrSlabLocation
 | 
					import gay.pizza.pork.bir.IrSlabLocation
 | 
				
			||||||
 | 
					import gay.pizza.pork.bir.IrSymbolTag
 | 
				
			||||||
import gay.pizza.pork.frontend.Slab
 | 
					import gay.pizza.pork.frontend.Slab
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CompilableSlab(val compiler: Compiler, val slab: Slab) {
 | 
					class CompilableSlab(val compiler: Compiler, val slab: Slab) {
 | 
				
			||||||
@ -20,11 +21,12 @@ class CompilableSlab(val compiler: Compiler, val slab: Slab) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private fun compileIrSlab(): IrSlab {
 | 
					  private fun compileIrSlab(): IrSlab {
 | 
				
			||||||
 | 
					    val slabSymbol = compiler.irSymbolAssignment.next(IrSymbolTag.Slab, slab.location.commonLocationIdentity)
 | 
				
			||||||
    val definitions = mutableListOf<IrDefinition>()
 | 
					    val definitions = mutableListOf<IrDefinition>()
 | 
				
			||||||
    for (compilableSymbol in compilableSymbols) {
 | 
					    for (compilableSymbol in compilableSymbols) {
 | 
				
			||||||
      definitions.add(compilableSymbol.compiledIrDefinition)
 | 
					      definitions.add(compilableSymbol.compiledIrDefinition)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath)
 | 
					    val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath)
 | 
				
			||||||
    return IrSlab(irSlabLocation, definitions)
 | 
					    return IrSlab(slabSymbol, irSlabLocation, definitions)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -29,7 +29,7 @@ class CompilableSymbol(val compilableSlab: CompilableSlab, val scopeSymbol: Scop
 | 
				
			|||||||
  private fun compileIrDefinition(): IrDefinition {
 | 
					  private fun compileIrDefinition(): IrDefinition {
 | 
				
			||||||
    val compiler = compilableSlab.compiler
 | 
					    val compiler = compilableSlab.compiler
 | 
				
			||||||
    val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id)
 | 
					    val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id)
 | 
				
			||||||
    val irCodeEmitter = IrCodeEmitter(
 | 
					    val irCodeEmitter = AstIrEmitter(
 | 
				
			||||||
      self = functionSymbol,
 | 
					      self = functionSymbol,
 | 
				
			||||||
      irSymbolWorld = compiler.irSymbolWorld,
 | 
					      irSymbolWorld = compiler.irSymbolWorld,
 | 
				
			||||||
      irSymbolAssignment = compiler.irSymbolAssignment,
 | 
					      irSymbolAssignment = compiler.irSymbolAssignment,
 | 
				
			||||||
 | 
				
			|||||||
@ -4,16 +4,26 @@ import com.charleskorn.kaml.PolymorphismStyle
 | 
				
			|||||||
import com.charleskorn.kaml.Yaml
 | 
					import com.charleskorn.kaml.Yaml
 | 
				
			||||||
import com.github.ajalt.clikt.core.CliktCommand
 | 
					import com.github.ajalt.clikt.core.CliktCommand
 | 
				
			||||||
import com.github.ajalt.clikt.parameters.arguments.argument
 | 
					import com.github.ajalt.clikt.parameters.arguments.argument
 | 
				
			||||||
 | 
					import com.github.ajalt.clikt.parameters.options.flag
 | 
				
			||||||
 | 
					import com.github.ajalt.clikt.parameters.options.option
 | 
				
			||||||
import gay.pizza.dough.fs.PlatformFsProvider
 | 
					import gay.pizza.dough.fs.PlatformFsProvider
 | 
				
			||||||
import gay.pizza.pork.ast.gen.Symbol
 | 
					import gay.pizza.pork.ast.gen.Symbol
 | 
				
			||||||
 | 
					import gay.pizza.pork.bir.IrSymbolGraph
 | 
				
			||||||
import gay.pizza.pork.bir.IrWorld
 | 
					import gay.pizza.pork.bir.IrWorld
 | 
				
			||||||
import gay.pizza.pork.bytecode.CompiledWorld
 | 
					import gay.pizza.pork.bytecode.CompiledWorld
 | 
				
			||||||
import gay.pizza.pork.compiler.Compiler
 | 
					import gay.pizza.pork.compiler.Compiler
 | 
				
			||||||
import gay.pizza.pork.minimal.FileTool
 | 
					import gay.pizza.pork.minimal.FileTool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "compile") {
 | 
					class CompileCommand : CliktCommand(help = "Compile Pork", name = "compile") {
 | 
				
			||||||
 | 
					  val showIrCode by option("--show-ir-code").flag(default = false)
 | 
				
			||||||
 | 
					  val showIrSymbolGraph by option("--show-ir-symbol-graph").flag(default = false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  val path by argument("file")
 | 
					  val path by argument("file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private val yaml = Yaml(configuration = Yaml.default.configuration.copy(
 | 
				
			||||||
 | 
					    polymorphismStyle = PolymorphismStyle.Property
 | 
				
			||||||
 | 
					  ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun run() {
 | 
					  override fun run() {
 | 
				
			||||||
    val tool = FileTool(PlatformFsProvider.resolve(path))
 | 
					    val tool = FileTool(PlatformFsProvider.resolve(path))
 | 
				
			||||||
    val world = tool.buildWorld()
 | 
					    val world = tool.buildWorld()
 | 
				
			||||||
@ -22,16 +32,22 @@ class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "c
 | 
				
			|||||||
    val compiledSlab = compiler.compilableSlabs.of(slab)
 | 
					    val compiledSlab = compiler.compilableSlabs.of(slab)
 | 
				
			||||||
    val compiledMain = compiledSlab.resolve(Symbol("main"))
 | 
					    val compiledMain = compiledSlab.resolve(Symbol("main"))
 | 
				
			||||||
      ?: throw RuntimeException("'main' function not found.")
 | 
					      ?: throw RuntimeException("'main' function not found.")
 | 
				
			||||||
    val compiledWorld = compiler.compile(compiledMain)
 | 
					 | 
				
			||||||
    val irWorld = compiler.compileIrWorld()
 | 
					    val irWorld = compiler.compileIrWorld()
 | 
				
			||||||
    printCompiledIr(irWorld)
 | 
					    val compiledWorld = compiler.compile(compiledMain)
 | 
				
			||||||
 | 
					    if (showIrCode) {
 | 
				
			||||||
 | 
					      printCompiledIr(irWorld)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (showIrSymbolGraph) {
 | 
				
			||||||
 | 
					      val irSymbolGraph = IrSymbolGraph()
 | 
				
			||||||
 | 
					      irSymbolGraph.buildFromRoot(irWorld)
 | 
				
			||||||
 | 
					      println(yaml.encodeToString(IrSymbolGraph.serializer(), irSymbolGraph))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    printCompiledWorld(compiledWorld)
 | 
					    printCompiledWorld(compiledWorld)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private fun printCompiledIr(irWorld: IrWorld) {
 | 
					  private fun printCompiledIr(irWorld: IrWorld) {
 | 
				
			||||||
    val yaml = Yaml(configuration = Yaml.default.configuration.copy(
 | 
					 | 
				
			||||||
      polymorphismStyle = PolymorphismStyle.Property
 | 
					 | 
				
			||||||
    ))
 | 
					 | 
				
			||||||
    println(yaml.encodeToString(IrWorld.serializer(), irWorld))
 | 
					    println(yaml.encodeToString(IrWorld.serializer(), irWorld))
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user