mirror of
				https://github.com/GayPizzaSpecifications/pork.git
				synced 2025-11-03 17:39:38 +00:00 
			
		
		
		
	compiler: declare symbols before store so that symbol graph works
This commit is contained in:
		
							
								
								
									
										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)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user