mirror of
https://github.com/irmen/prog8.git
synced 2024-12-25 08:29:25 +00:00
some more typecheckings and indexing on matrixes
This commit is contained in:
parent
34d26e42e1
commit
7b51597fe9
@ -4,12 +4,13 @@
|
||||
|
||||
~ main {
|
||||
|
||||
byte[2] barray = 0
|
||||
byte[2] barray2 =0
|
||||
byte[10,5] barray = 0
|
||||
|
||||
sub start() {
|
||||
X=barray[0]
|
||||
return
|
||||
X=barray[2,3]
|
||||
barray[3,3]=X
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -233,8 +233,6 @@ class AstChecker(private val namespace: INameScope,
|
||||
* Also check data type compatibility
|
||||
*/
|
||||
override fun process(assignment: Assignment): IStatement {
|
||||
// todo deal with target.arrayindexed
|
||||
|
||||
if(assignment.target.identifier!=null) {
|
||||
val targetName = assignment.target.identifier!!.nameInSource
|
||||
val targetSymbol = namespace.lookup(targetName, assignment)
|
||||
@ -273,7 +271,6 @@ class AstChecker(private val namespace: INameScope,
|
||||
else if(assignment.target.identifier!=null)
|
||||
assignment.target.identifier!!
|
||||
else if(assignment.target.arrayindexed!=null) {
|
||||
// todo deal with target.arrayindexed
|
||||
assignment.target.arrayindexed!!
|
||||
} else throw FatalAstException("strange assignment")
|
||||
|
||||
@ -575,7 +572,21 @@ class AstChecker(private val namespace: INameScope,
|
||||
}
|
||||
}
|
||||
} else if(postIncrDecr.target.arrayindexed!=null) {
|
||||
// todo deal with target.arrayindexed
|
||||
val indexedRegister = postIncrDecr.target.arrayindexed?.register
|
||||
if(indexedRegister!=null) {
|
||||
if(indexedRegister==Register.A || indexedRegister==Register.X || indexedRegister==Register.Y)
|
||||
checkResult.add(SyntaxError("array indexing on registers requires register pair variable", postIncrDecr.position))
|
||||
} else {
|
||||
val target = postIncrDecr.target.arrayindexed?.identifier?.targetStatement(namespace)
|
||||
if(target==null) {
|
||||
checkResult.add(SyntaxError("undefined symbol", postIncrDecr.position))
|
||||
}
|
||||
else {
|
||||
val dt = (target as VarDecl).datatype
|
||||
if(dt!=DataType.ARRAY && dt!=DataType.ARRAY_W && dt!=DataType.ARRAY_F)
|
||||
checkResult.add(SyntaxError("can only increment or decrement a byte/float/word", postIncrDecr.position))
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.process(postIncrDecr)
|
||||
}
|
||||
|
@ -468,6 +468,7 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram,
|
||||
DataType.ARRAY -> Opcode.READ_INDEXED_VAR
|
||||
DataType.ARRAY_W -> Opcode.READ_INDEXED_VAR_W
|
||||
DataType.ARRAY_F -> Opcode.READ_INDEXED_VAR_F
|
||||
DataType.MATRIX -> Opcode.READ_INDEXED_VAR
|
||||
else -> throw CompilerException("invalid dt for indexed $dt")
|
||||
}
|
||||
}
|
||||
@ -477,6 +478,7 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram,
|
||||
DataType.ARRAY -> Opcode.WRITE_INDEXED_VAR
|
||||
DataType.ARRAY_W -> Opcode.WRITE_INDEXED_VAR_W
|
||||
DataType.ARRAY_F -> Opcode.WRITE_INDEXED_VAR_F
|
||||
DataType.MATRIX -> Opcode.WRITE_INDEXED_VAR
|
||||
else -> throw CompilerException("invalid dt for indexed $dt")
|
||||
}
|
||||
}
|
||||
@ -1110,10 +1112,18 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram,
|
||||
stackvmProg.instr(Opcode.ADD_W)
|
||||
}
|
||||
|
||||
if(write)
|
||||
stackvmProg.instr(opcodeWriteindexedvar(variable!!.datatype), callLabel = variableName)
|
||||
if(variable!=null) {
|
||||
if (write)
|
||||
stackvmProg.instr(opcodeWriteindexedvar(variable.datatype), callLabel = variableName)
|
||||
else
|
||||
stackvmProg.instr(opcodeReadindexedvar(variable!!.datatype), callLabel = variableName)
|
||||
stackvmProg.instr(opcodeReadindexedvar(variable.datatype), callLabel = variableName)
|
||||
} else {
|
||||
// register indexed
|
||||
if (write)
|
||||
stackvmProg.instr(opcodeWriteindexedvar(DataType.ARRAY), callLabel = arrayindexed.register!!.toString())
|
||||
else
|
||||
stackvmProg.instr(opcodeReadindexedvar(DataType.ARRAY), callLabel = arrayindexed.register!!.toString())
|
||||
}
|
||||
}
|
||||
|
||||
private fun createSyscall(funcname: String) {
|
||||
|
Loading…
Reference in New Issue
Block a user