mirror of
https://github.com/irmen/prog8.git
synced 2025-01-14 17:31:01 +00:00
fix compiler crash with adding too many typecasts to args. useless lsb() and msb() are optimized away.
This commit is contained in:
parent
02e29e6990
commit
40071b1431
@ -139,6 +139,7 @@ class TypecastsAdder(val program: Program, val errors: ErrorReporter) : AstWalke
|
|||||||
call.args[arg.second.index],
|
call.args[arg.second.index],
|
||||||
TypecastExpression(arg.second.value, possibleType, true, arg.second.value.position),
|
TypecastExpression(arg.second.value, possibleType, true, arg.second.value.position),
|
||||||
call as Node)
|
call as Node)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -297,6 +297,49 @@ internal class ExpressionSimplifier(private val program: Program) : AstWalker()
|
|||||||
return noModifications
|
return noModifications
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun after(functionCall: FunctionCall, parent: Node): Iterable<IAstModification> {
|
||||||
|
if(functionCall.target.nameInSource == listOf("lsb")) {
|
||||||
|
val arg = functionCall.args[0]
|
||||||
|
if(arg is TypecastExpression) {
|
||||||
|
val valueDt = arg.expression.inferType(program)
|
||||||
|
if (valueDt.istype(DataType.BYTE) || valueDt.istype(DataType.UBYTE)) {
|
||||||
|
// useless lsb() of byte value that was casted to word
|
||||||
|
return listOf(IAstModification.ReplaceNode(functionCall, arg.expression, parent))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val argDt = arg.inferType(program)
|
||||||
|
if (argDt.istype(DataType.BYTE) || argDt.istype(DataType.UBYTE)) {
|
||||||
|
// useless lsb() of byte value
|
||||||
|
return listOf(IAstModification.ReplaceNode(functionCall, arg, parent))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(functionCall.target.nameInSource == listOf("msb")) {
|
||||||
|
val arg = functionCall.args[0]
|
||||||
|
if(arg is TypecastExpression) {
|
||||||
|
val valueDt = arg.expression.inferType(program)
|
||||||
|
if (valueDt.istype(DataType.BYTE) || valueDt.istype(DataType.UBYTE)) {
|
||||||
|
// useless msb() of byte value that was casted to word, replace with 0
|
||||||
|
return listOf(IAstModification.ReplaceNode(
|
||||||
|
functionCall,
|
||||||
|
NumericLiteralValue(valueDt.typeOrElse(DataType.UBYTE), 0, arg.expression.position),
|
||||||
|
parent))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val argDt = arg.inferType(program)
|
||||||
|
if (argDt.istype(DataType.BYTE) || argDt.istype(DataType.UBYTE)) {
|
||||||
|
// useless msb() of byte value, replace with 0
|
||||||
|
return listOf(IAstModification.ReplaceNode(
|
||||||
|
functionCall,
|
||||||
|
NumericLiteralValue(argDt.typeOrElse(DataType.UBYTE), 0, arg.position),
|
||||||
|
parent))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return noModifications
|
||||||
|
}
|
||||||
|
|
||||||
private fun determineY(x: Expression, subBinExpr: BinaryExpression): Expression? {
|
private fun determineY(x: Expression, subBinExpr: BinaryExpression): Expression? {
|
||||||
return when {
|
return when {
|
||||||
subBinExpr.left isSameAs x -> subBinExpr.right
|
subBinExpr.left isSameAs x -> subBinExpr.right
|
||||||
|
@ -11,9 +11,6 @@ main {
|
|||||||
|
|
||||||
c64.CHROUT('*')
|
c64.CHROUT('*')
|
||||||
|
|
||||||
uword value = lsb(rnd() & 31) ; TODO fix compiler crash
|
|
||||||
|
|
||||||
|
|
||||||
;asmsub clear_screen (ubyte char @ A, ubyte color @ Y) clobbers(A) { ...}
|
;asmsub clear_screen (ubyte char @ A, ubyte color @ Y) clobbers(A) { ...}
|
||||||
; TODO dont cause name conflict if we define sub or sub with param 'color' or even a var 'color' later.
|
; TODO dont cause name conflict if we define sub or sub with param 'color' or even a var 'color' later.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user