mirror of
https://github.com/irmen/prog8.git
synced 2024-11-22 15:33:02 +00:00
fix invalid size copied when assigning non-byte arrays
This commit is contained in:
parent
7afc96112b
commit
1e053783f3
@ -129,7 +129,7 @@ class AsmGen(private val program: Program,
|
||||
(vardecl.value as StringLiteralValue).value.length
|
||||
}
|
||||
in ArrayDatatypes -> {
|
||||
vardecl.arraysize!!.constIndex()
|
||||
vardecl.arraysize!!.constIndex() // TODO wrong size for non-byte arrays??????? or does datatype get taken into account below
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
@ -1193,7 +1193,7 @@ class AsmGen(private val program: Program,
|
||||
jsr prog8_lib.strcpy""")
|
||||
}
|
||||
arrayVarsInZp.forEach {
|
||||
val numelements = (it.value as ArrayLiteralValue).value.size
|
||||
val numelements = (it.value as ArrayLiteralValue).value.size // TODO wrong size for word/float arrays!???
|
||||
out("""
|
||||
lda #<${it.name}_init_value
|
||||
ldy #>${it.name}_init_value
|
||||
|
@ -370,11 +370,13 @@ internal class StatementReorderer(val program: Program,
|
||||
if(!errors.noErrors())
|
||||
return noModifications
|
||||
|
||||
val numelements = targetVar.arraysize!!.constIndex()!!
|
||||
val eltsize = program.memsizer.memorySize(ArrayToElementTypes.getValue(sourceVar.datatype))
|
||||
val memcopy = FunctionCallStatement(IdentifierReference(listOf("sys", "memcopy"), assign.position),
|
||||
mutableListOf(
|
||||
AddressOf(sourceIdent, assign.position),
|
||||
AddressOf(identifier, assign.position),
|
||||
NumericLiteralValue.optimalInteger(targetVar.arraysize!!.constIndex()!!, assign.position)
|
||||
NumericLiteralValue.optimalInteger(numelements*eltsize, assign.position)
|
||||
),
|
||||
true,
|
||||
assign.position
|
||||
|
@ -3,6 +3,8 @@ TODO
|
||||
|
||||
For next release
|
||||
^^^^^^^^^^^^^^^^
|
||||
- check/fix allocateAllZeropageVariables() for wrong array byte size?
|
||||
- check/fix entrypointInitialization() for non-byte arrays in ZP, memcopy size wrong?
|
||||
- Fix compiler stack overflow crash:
|
||||
sub sprite_y_for_row(ubyte row) -> word {
|
||||
return (8-row as byte)
|
||||
@ -10,11 +12,6 @@ For next release
|
||||
- fix crash:
|
||||
word[33] sprites_x = sprites.sprites_x
|
||||
word[33] sprites_y = sprites.sprites_y
|
||||
- fix assignment code generated for: (memcopying manuall does work correctly)
|
||||
word[33] sprites_x
|
||||
word[33] sprites_y
|
||||
sprites_x = sprites.sprites_x
|
||||
sprites_y = sprites.sprites_y
|
||||
- Fix: better error message for len() in:
|
||||
ubyte[64] chessboard
|
||||
sub init() {
|
||||
|
@ -3,15 +3,23 @@
|
||||
|
||||
main {
|
||||
sub start() {
|
||||
word[3] @shared sprites_x ; = sprites.sprites_x
|
||||
sprites_x = sprites.sprites_x
|
||||
word[3] @shared sprites_y ; = sprites.sprites_y
|
||||
sprites_y = sprites.sprites_y
|
||||
|
||||
label:
|
||||
uword @shared addr
|
||||
addr = label
|
||||
addr = thing
|
||||
addr = &label
|
||||
addr = &thing
|
||||
}
|
||||
|
||||
sub thing() {
|
||||
txt.print_w(sprites.sprites_x[2])
|
||||
txt.nl()
|
||||
txt.print_w(sprites.sprites_y[2])
|
||||
txt.nl()
|
||||
txt.print_w(sprites_x[2])
|
||||
txt.nl()
|
||||
txt.print_w(sprites_y[2])
|
||||
txt.nl()
|
||||
}
|
||||
}
|
||||
|
||||
sprites {
|
||||
word[3] sprites_x = [111,222,333]
|
||||
word[3] sprites_y = [666,777,888]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user