mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-02 12:50:55 +00:00
compiler: declare symbols before store so that symbol graph works
This commit is contained in:
parent
3dbf8f9c4a
commit
962d079acc
10
bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt
Normal file
10
bir/src/main/kotlin/gay/pizza/pork/bir/IrDeclare.kt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package gay.pizza.pork.bir
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class IrDeclare(override val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolOwner {
|
||||||
|
override fun crawl(block: (IrElement) -> Unit) {
|
||||||
|
value.crawl(block)
|
||||||
|
}
|
||||||
|
}
|
@ -29,6 +29,7 @@ interface IrVisitor<T> {
|
|||||||
fun visitIrFunctionArgument(ir: IrFunctionArgument): T
|
fun visitIrFunctionArgument(ir: IrFunctionArgument): T
|
||||||
fun visitIrIndex(ir: IrIndex): T
|
fun visitIrIndex(ir: IrIndex): T
|
||||||
fun visitIrListSize(ir: IrListSize): T
|
fun visitIrListSize(ir: IrListSize): T
|
||||||
|
fun visitIrDeclare(ir: IrDeclare): T
|
||||||
|
|
||||||
fun visit(ir: IrElement): T = when (ir) {
|
fun visit(ir: IrElement): T = when (ir) {
|
||||||
is IrBreak -> visitIrBeak(ir)
|
is IrBreak -> visitIrBeak(ir)
|
||||||
@ -59,5 +60,6 @@ interface IrVisitor<T> {
|
|||||||
is IrFunctionArgument -> visitIrFunctionArgument(ir)
|
is IrFunctionArgument -> visitIrFunctionArgument(ir)
|
||||||
is IrIndex -> visitIrIndex(ir)
|
is IrIndex -> visitIrIndex(ir)
|
||||||
is IrListSize -> visitIrListSize(ir)
|
is IrListSize -> visitIrListSize(ir)
|
||||||
|
is IrDeclare -> visitIrDeclare(ir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ class IrCodeEmitter(
|
|||||||
|
|
||||||
override fun visitLetAssignment(node: LetAssignment): IrCodeElement {
|
override fun visitLetAssignment(node: LetAssignment): IrCodeElement {
|
||||||
val symbol = createLocalVariable(node.symbol)
|
val symbol = createLocalVariable(node.symbol)
|
||||||
return IrStore(symbol, node.value.visit(this))
|
return IrDeclare(symbol, node.value.visit(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitListLiteral(node: ListLiteral): IrCodeElement =
|
override fun visitListLiteral(node: ListLiteral): IrCodeElement =
|
||||||
@ -296,7 +296,7 @@ class IrCodeEmitter(
|
|||||||
|
|
||||||
override fun visitVarAssignment(node: VarAssignment): IrCodeElement {
|
override fun visitVarAssignment(node: VarAssignment): IrCodeElement {
|
||||||
val local = createLocalVariable(node.symbol)
|
val local = createLocalVariable(node.symbol)
|
||||||
return IrStore(local, node.value.visit(this))
|
return IrDeclare(local, node.value.visit(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitWhile(node: While): IrCodeElement = loop { symbol ->
|
override fun visitWhile(node: While): IrCodeElement = loop { symbol ->
|
||||||
|
@ -188,6 +188,12 @@ class IrStubOpEmitter(val irDefinition: IrDefinition, val code: CodeBuilder) : I
|
|||||||
code.emit(Opcode.Return)
|
code.emit(Opcode.Return)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitIrDeclare(ir: IrDeclare) {
|
||||||
|
visit(ir.value)
|
||||||
|
val variable = code.localState.createOrFindLocal(ir.symbol)
|
||||||
|
store(variable)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitIrStore(ir: IrStore) {
|
override fun visitIrStore(ir: IrStore) {
|
||||||
visit(ir.value)
|
visit(ir.value)
|
||||||
val variable = code.localState.createOrFindLocal(ir.target)
|
val variable = code.localState.createOrFindLocal(ir.target)
|
||||||
|
Loading…
Reference in New Issue
Block a user