fix: also allow pass-by-reference arguments to builtin functions that accept UWORD (adds implicit type cast)

This commit is contained in:
Irmen de Jong 2021-11-28 02:34:53 +01:00
parent 7c5ec1853d
commit 68b75fd558
2 changed files with 36 additions and 18 deletions

View File

@ -192,6 +192,18 @@ class TypecastsAdder(val program: Program, val errors: IErrorReporter) : AstWalk
call as Node)
break
}
else if(DataType.UWORD in pair.first.possibleDatatypes && argtype in PassByReferenceDatatypes) {
// We allow STR/ARRAY values in place of UWORD parameters.
// Take their address instead, UNLESS it's a str parameter in the containing subroutine
val identifier = pair.second as? IdentifierReference
if(identifier?.isSubroutineParameter(program)==false) {
modifications += IAstModification.ReplaceNode(
call.args[index],
AddressOf(identifier, pair.second.position),
call as Node)
break
}
}
}
}
}

View File

@ -3,28 +3,34 @@
main {
ubyte[23] savedata
ubyte[17] cargohold = 0
sub start() {
test_stack.test()
uword @shared uw
ubyte @shared ub
word @shared ww
sys.memcopy(&savedata + 2, cargohold, len(cargohold))
sys.memcopy(cargohold, &savedata + 2, len(cargohold))
push(127)
pop(ub)
txt.print_ub(ub)
txt.nl()
pushw(32767)
popw(uw)
txt.print_uw(uw)
txt.nl()
uw=10000
routines(44,uw+123)
routines2(44,uw+123)
routine(uw+123, 22,33, true, 44)
routine2(uw+123, 22,33, true, 44)
; uword @shared uw
; ubyte @shared ub
; word @shared ww
;
; push(127)
; pop(ub)
; txt.print_ub(ub)
; txt.nl()
; pushw(32767)
; popw(uw)
; txt.print_uw(uw)
; txt.nl()
;
; uw=10000
; routines(44,uw+123)
; routines2(44,uw+123)
;
; routine(uw+123, 22,33, true, 44)
; routine2(uw+123, 22,33, true, 44)
test_stack.test()