mirror of
https://github.com/irmen/prog8.git
synced 2024-09-10 09:54:32 +00:00
if passing a subroutine or label name as an uword argument, without &, add the addressof automatically
This commit is contained in:
parent
e1c77ce236
commit
4b336b1853
@ -197,6 +197,16 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// if the argument is an identifier reference and the param is UWORD, add the missing &.
|
||||||
|
if(arg is IdentifierReference && DataType.UWORD == param.type) {
|
||||||
|
modifications += IAstModification.ReplaceNode(
|
||||||
|
arg,
|
||||||
|
AddressOf(arg, arg.position),
|
||||||
|
call as Node
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is BuiltinFunctionPlaceholder -> {
|
is BuiltinFunctionPlaceholder -> {
|
||||||
@ -226,6 +236,16 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// if the argument is an identifier reference and the param is UWORD, add the missing &.
|
||||||
|
if(pair.second is IdentifierReference && DataType.UWORD in pair.first.possibleDatatypes) {
|
||||||
|
modifications += IAstModification.ReplaceNode(
|
||||||
|
call.args[index],
|
||||||
|
AddressOf(pair.second as IdentifierReference, pair.second.position),
|
||||||
|
call as Node
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> { }
|
else -> { }
|
||||||
|
@ -5,6 +5,10 @@ import io.kotest.matchers.ints.shouldBeGreaterThan
|
|||||||
import io.kotest.matchers.shouldBe
|
import io.kotest.matchers.shouldBe
|
||||||
import io.kotest.matchers.shouldNotBe
|
import io.kotest.matchers.shouldNotBe
|
||||||
import io.kotest.matchers.string.shouldContain
|
import io.kotest.matchers.string.shouldContain
|
||||||
|
import io.kotest.matchers.types.instanceOf
|
||||||
|
import prog8.ast.IFunctionCall
|
||||||
|
import prog8.ast.expressions.AddressOf
|
||||||
|
import prog8.ast.expressions.IdentifierReference
|
||||||
import prog8.code.target.C64Target
|
import prog8.code.target.C64Target
|
||||||
import prog8tests.helpers.ErrorReporterForTests
|
import prog8tests.helpers.ErrorReporterForTests
|
||||||
import prog8tests.helpers.compileText
|
import prog8tests.helpers.compileText
|
||||||
@ -12,6 +16,41 @@ import prog8tests.helpers.compileText
|
|||||||
|
|
||||||
class TestTypecasts: FunSpec({
|
class TestTypecasts: FunSpec({
|
||||||
|
|
||||||
|
test("add missing & to function arguments") {
|
||||||
|
val text="""
|
||||||
|
main {
|
||||||
|
|
||||||
|
sub handler(uword fptr) {
|
||||||
|
}
|
||||||
|
|
||||||
|
sub start() {
|
||||||
|
uword variable
|
||||||
|
|
||||||
|
pushw(variable)
|
||||||
|
pushw(handler)
|
||||||
|
pushw(&handler)
|
||||||
|
handler(variable)
|
||||||
|
handler(handler)
|
||||||
|
handler(&handler)
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
val result = compileText(C64Target(), false, text, writeAssembly = false)!!
|
||||||
|
val stmts = result.program.entrypoint.statements
|
||||||
|
stmts.size shouldBe 8
|
||||||
|
val arg1 = (stmts[2] as IFunctionCall).args.single()
|
||||||
|
val arg2 = (stmts[3] as IFunctionCall).args.single()
|
||||||
|
val arg3 = (stmts[4] as IFunctionCall).args.single()
|
||||||
|
val arg4 = (stmts[5] as IFunctionCall).args.single()
|
||||||
|
val arg5 = (stmts[6] as IFunctionCall).args.single()
|
||||||
|
val arg6 = (stmts[7] as IFunctionCall).args.single()
|
||||||
|
arg1 shouldBe instanceOf<IdentifierReference>()
|
||||||
|
arg2 shouldBe instanceOf<AddressOf>()
|
||||||
|
arg3 shouldBe instanceOf<AddressOf>()
|
||||||
|
arg4 shouldBe instanceOf<IdentifierReference>()
|
||||||
|
arg5 shouldBe instanceOf<AddressOf>()
|
||||||
|
arg6 shouldBe instanceOf<AddressOf>()
|
||||||
|
}
|
||||||
|
|
||||||
test("correct typecasts") {
|
test("correct typecasts") {
|
||||||
val text = """
|
val text = """
|
||||||
%import floats
|
%import floats
|
||||||
|
@ -3,7 +3,6 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- if passing a subroutine or label name as an uword argument, without &, add the addressof automatically
|
|
||||||
- convert the sounds in cx16 tehtriz to use the psg module instead
|
- convert the sounds in cx16 tehtriz to use the psg module instead
|
||||||
- notify petaxian that it could use the psg module too?
|
- notify petaxian that it could use the psg module too?
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user