mirror of
https://github.com/irmen/prog8.git
synced 2025-10-25 05:18:38 +00:00
fix 6502 inplace pointer variable assignment
This commit is contained in:
@@ -1440,7 +1440,7 @@ $repeatLabel""")
|
||||
if(params!=null) {
|
||||
for(param in params) {
|
||||
param as PtSubroutineParameter
|
||||
if(param.name==name)
|
||||
if(param.scopedName==name)
|
||||
return param
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,6 +55,10 @@ internal class AsmAssignTarget(val kind: TargetStorageKind,
|
||||
require(register!=null)
|
||||
else
|
||||
require(register==null)
|
||||
if(kind==TargetStorageKind.POINTER)
|
||||
require(pointer!=null)
|
||||
if(pointer!=null)
|
||||
require(kind==TargetStorageKind.POINTER)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -85,22 +85,23 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
|
||||
}
|
||||
}
|
||||
}
|
||||
target.datatype.isWord -> {
|
||||
target.datatype.isWord || target.datatype.isPointer -> {
|
||||
val block = target.origAstTarget?.definingBlock()
|
||||
val targetDt = if(target.datatype.isWord) target.datatype else DataType.UWORD // pointers themselves that get a new value are just treated as UWORD variables
|
||||
when(value.kind) {
|
||||
SourceStorageKind.LITERALBOOLEAN -> inplacemodificationWordWithLiteralval(target.asmVarname, target.datatype, operator, value.boolean!!.asInt(), block)
|
||||
SourceStorageKind.LITERALNUMBER -> inplacemodificationWordWithLiteralval(target.asmVarname, target.datatype, operator, value.number!!.number.toInt(), block)
|
||||
SourceStorageKind.VARIABLE -> inplacemodificationWordWithVariable(target.asmVarname, target.datatype, operator, value.asmVarname, value.datatype, block)
|
||||
SourceStorageKind.REGISTER -> inplacemodificationWordWithVariable(target.asmVarname, target.datatype, operator, regName(value), value.datatype, block)
|
||||
SourceStorageKind.MEMORY -> inplacemodificationWordWithMemread(target.asmVarname, target.datatype, operator, value.memory!!)
|
||||
SourceStorageKind.ARRAY -> inplacemodificationWordWithValue(target.asmVarname, target.datatype, operator, value.array!!, block)
|
||||
SourceStorageKind.LITERALBOOLEAN -> inplacemodificationWordWithLiteralval(target.asmVarname, targetDt, operator, value.boolean!!.asInt(), block)
|
||||
SourceStorageKind.LITERALNUMBER -> inplacemodificationWordWithLiteralval(target.asmVarname, targetDt, operator, value.number!!.number.toInt(), block)
|
||||
SourceStorageKind.VARIABLE -> inplacemodificationWordWithVariable(target.asmVarname, targetDt, operator, value.asmVarname, value.datatype, block)
|
||||
SourceStorageKind.REGISTER -> inplacemodificationWordWithVariable(target.asmVarname, targetDt, operator, regName(value), value.datatype, block)
|
||||
SourceStorageKind.MEMORY -> inplacemodificationWordWithMemread(target.asmVarname, targetDt, operator, value.memory!!)
|
||||
SourceStorageKind.ARRAY -> inplacemodificationWordWithValue(target.asmVarname, targetDt, operator, value.array!!, block)
|
||||
SourceStorageKind.EXPRESSION -> {
|
||||
if(value.expression is PtTypeCast) {
|
||||
if (tryInplaceModifyWithRemovedRedundantCast(value.expression, target, operator)) return
|
||||
inplacemodificationWordWithValue(target.asmVarname, target.datatype, operator, value.expression, block)
|
||||
inplacemodificationWordWithValue(target.asmVarname, targetDt, operator, value.expression, block)
|
||||
}
|
||||
else {
|
||||
inplacemodificationWordWithValue(target.asmVarname, target.datatype, operator, value.expression!!, block)
|
||||
inplacemodificationWordWithValue(target.asmVarname, targetDt, operator, value.expression!!, block)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -123,8 +124,6 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
|
||||
}
|
||||
}
|
||||
}
|
||||
target.datatype.isPointer ->
|
||||
ptrgen.inplaceModification(PtrTarget(target), operator, value)
|
||||
else -> throw AssemblyError("weird type to do in-place modification on ${target.datatype}")
|
||||
}
|
||||
}
|
||||
@@ -309,7 +308,7 @@ internal class AugmentableAssignmentAsmGen(private val program: PtProgram,
|
||||
}
|
||||
}
|
||||
}
|
||||
target.datatype.isPointer -> ptrgen.inplaceModification(PtrTarget(target), operator, value)
|
||||
target.datatype.isPointer -> TODO("inplace modification of pointer array ${target.position}")
|
||||
else -> throw AssemblyError("weird type to do in-place modification on ${target.datatype}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1390,6 +1390,7 @@ main {
|
||||
}
|
||||
|
||||
sub test(str argument) -> str {
|
||||
argument++
|
||||
return "bye"
|
||||
}
|
||||
}"""
|
||||
@@ -1397,11 +1398,21 @@ main {
|
||||
val vmtest = vmprg.codegenAst!!.allBlocks().first { it.name == "main" }.children[1] as PtSub
|
||||
vmtest.signature.returns.single() shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
(vmtest.signature.children.single() as PtSubroutineParameter).type shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
val vminc = vmtest.children[2] as PtAugmentedAssign
|
||||
vminc.operator shouldBe "+="
|
||||
vminc.target.identifier!!.name shouldBe "main.test.argument"
|
||||
vminc.target.identifier!!.type shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
(vminc.value as PtNumber).number shouldBe 1.0
|
||||
|
||||
val c64prg = compileText(C64Target(), false, src, outputDir)!!
|
||||
val c64test = c64prg.codegenAst!!.allBlocks().first { it.name == "p8b_main" }.children[1] as PtSub
|
||||
c64test.signature.returns.single() shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
(c64test.signature.children.single() as PtSubroutineParameter).type shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
val c64inc = c64test.children[2] as PtAugmentedAssign
|
||||
c64inc.operator shouldBe "+="
|
||||
c64inc.target.identifier!!.name shouldBe "p8b_main.p8s_test.p8v_argument"
|
||||
c64inc.target.identifier!!.type shouldBe DataType.pointer(BaseDataType.UBYTE)
|
||||
(c64inc.value as PtNumber).number shouldBe 1.0
|
||||
}
|
||||
|
||||
test("hoist variable decl and initializer correctly in case of pointer type variable as well") {
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
main {
|
||||
sub start() {
|
||||
|
||||
label:
|
||||
uword @shared addr
|
||||
addr = label
|
||||
addr = thing
|
||||
addr = &label
|
||||
addr = &thing
|
||||
console_write("sdf")
|
||||
}
|
||||
|
||||
sub thing() {
|
||||
sub console_write(^^ubyte isoString) {
|
||||
isoString++
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user