mirror of
https://github.com/irmen/prog8.git
synced 2024-12-22 03:29:41 +00:00
improve vm error message when referencing a block name
This commit is contained in:
parent
b4fb43bc80
commit
d78ce77536
@ -92,7 +92,6 @@ class IRCodeGen(
|
||||
when (node) {
|
||||
is PtBuiltinFunctionCall -> require('.' !in node.name) { "builtin function call name should not be scoped: ${node.name}" }
|
||||
is PtFunctionCall -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
is PtIdentifier -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
is PtAsmSub -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
is PtBlock -> require('.' !in node.name) { "block name should not be scoped: ${node.name}" }
|
||||
is PtConstant -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
@ -102,8 +101,7 @@ class IRCodeGen(
|
||||
is PtVariable -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
is PtProgram -> require('.' !in node.name) { "program name should not be scoped: ${node.name}" }
|
||||
is PtSubroutineParameter -> require('.' in node.name) { "node $node name is not scoped: ${node.name}" }
|
||||
else -> { /* node has no name */
|
||||
}
|
||||
else -> { /* node has no name or is ok to have no dots in the name */ }
|
||||
}
|
||||
node.children.forEach { verifyPtNode(it) }
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ TODO
|
||||
Future Things and Ideas
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- implement const long to store a 32 bit signed integer value. (constants should be able to be long?) -> const_long branch
|
||||
- get rid of the BuiltinFunctionCall (and PtBuiltinFunctionCall) ast nodes distinction, just use 1 node type, they're mixed up now already anyways. -> remove-BFC-node branch
|
||||
- something to reduce the need to use fully qualified names all the time. 'with' ? Or 'using <prefix>'?
|
||||
- Why are blocks without an addr moved BEHIND a block with an address? That's done in the StatementReorderer.
|
||||
- Make extsub address a (constant) expression instead of a numeric literal
|
||||
- rename 'string' module to 'strings' to be consistent with 'floats'?
|
||||
- on the C64: make the floating point routines @banked so that basic can be permanently banked out even if you use floats? But this will crash when the call is done from program code at $a000+
|
||||
- Libraries: improve ability to create library files in prog8; for instance there's still stuff injected into the start of the start() routine AND there is separate setup logic going on before calling it.
|
||||
Make up our mind! Maybe all setup does need to be put into start() ? because the program cannot function correctly when the variables aren't initialized properly bss is not cleared etc. etc.
|
||||
@ -20,8 +20,6 @@ Future Things and Ideas
|
||||
in certain situations, the "wrong" order of evaluation of function call arguments is done which results
|
||||
in overwriting registers that already got their value, which requires a lot of stack juggling (especially on plain 6502 cpu!)
|
||||
Maybe this routine can be made more intelligent. See usesOtherRegistersWhileEvaluating() and argumentsViaRegisters().
|
||||
- remove 'extsub' as a recognised alternative for 'extsub'
|
||||
- remove the 'addmissingrts' compiler option.
|
||||
- Improve the SublimeText syntax file for prog8, you can also install this for 'bat': https://github.com/sharkdp/bat?tab=readme-ov-file#adding-new-syntaxes--language-definitions
|
||||
- Does it make codegen easier if everything is an expression? Start with the PtProgram ast , get rid of the statements there -> expressions that have Void data type
|
||||
- Can we support signed % (remainder) somehow?
|
||||
|
@ -1,53 +1,26 @@
|
||||
%import floats
|
||||
%import textio
|
||||
|
||||
main {
|
||||
sub start() {
|
||||
float zz
|
||||
thing()
|
||||
zz = thang(1.22)
|
||||
bool status
|
||||
cx16.r0L, status = extfunction(42, 11223, 999, 1.22, true)
|
||||
cx16.r0L, status = function(42, 11223, 999, 1.22, true)
|
||||
func1(42)
|
||||
func2(9999)
|
||||
func3(42,9999)
|
||||
func4(42,9999,12345)
|
||||
}
|
||||
|
||||
sub thing() -> bool {
|
||||
cx16.r0++
|
||||
return true
|
||||
}
|
||||
|
||||
sub thang(float arg) -> float {
|
||||
arg++
|
||||
return arg
|
||||
}
|
||||
|
||||
sub func1(ubyte arg) {
|
||||
cx16.r0L +=arg
|
||||
}
|
||||
|
||||
sub func2(uword arg) {
|
||||
cx16.r0 += arg
|
||||
}
|
||||
|
||||
sub func3(ubyte arg1, uword arg2) {
|
||||
cx16.r0 += arg2
|
||||
cx16.r0L =+ arg1
|
||||
}
|
||||
|
||||
sub func4(ubyte arg1, uword arg2, uword arg3) {
|
||||
cx16.r0L =+ arg1
|
||||
cx16.r0 += arg2
|
||||
cx16.r1 += arg3
|
||||
}
|
||||
|
||||
extsub $2000 = extfunction(ubyte arg1 @A, uword arg2 @XY, uword arg3 @R0, float frac @FAC1, bool flag @Pc) -> ubyte @Y, bool @Pz
|
||||
|
||||
asmsub function(ubyte arg1 @A, uword arg2 @XY, uword arg3 @R0, float frac @FAC1, bool flag @Pc) -> ubyte @Y, bool @Pz {
|
||||
%asm {{
|
||||
rts
|
||||
}}
|
||||
myblock.printit()
|
||||
myblock2.printit2()
|
||||
}
|
||||
}
|
||||
|
||||
myblock {
|
||||
sub printit() {
|
||||
txt.print_uwhex(&printit, true)
|
||||
txt.nl()
|
||||
txt.print_uwhex(&myblock, true)
|
||||
txt.nl()
|
||||
}
|
||||
}
|
||||
|
||||
myblock2 {
|
||||
sub printit2() {
|
||||
txt.print_uwhex(&printit2, true)
|
||||
txt.nl()
|
||||
txt.print_uwhex(&myblock2, true)
|
||||
txt.nl()
|
||||
}
|
||||
}
|
||||
|
@ -153,12 +153,13 @@ class VmProgramLoader {
|
||||
// placeholder is not a variable, so it must be a label of a code chunk instead
|
||||
val target: IRCodeChunk? = chunks.firstOrNull { it.label==label }
|
||||
if(target==null)
|
||||
throw IRParseException("placeholder not found in variables nor labels: $label")
|
||||
throw IRParseException("label '$label' not found in variables nor labels. VM cannot reference other things such as blocks")
|
||||
else if(instr.opcode in OpcodesThatBranch)
|
||||
chunk.instructions[line] = instr.copy(branchTarget = target, address = null)
|
||||
else {
|
||||
var address = artificialLabelAddresses[label]
|
||||
if(address==null) {
|
||||
// generate an artificial address
|
||||
address = 0xa000 + artificialLabelAddresses.size
|
||||
artificialLabelAddresses[label] = address
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user