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) call as Node)
break 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 { main {
ubyte[23] savedata
ubyte[17] cargohold = 0
sub start() { sub start() {
test_stack.test() test_stack.test()
uword @shared uw sys.memcopy(&savedata + 2, cargohold, len(cargohold))
ubyte @shared ub sys.memcopy(cargohold, &savedata + 2, len(cargohold))
word @shared ww
push(127) ; uword @shared uw
pop(ub) ; ubyte @shared ub
txt.print_ub(ub) ; word @shared ww
txt.nl() ;
pushw(32767) ; push(127)
popw(uw) ; pop(ub)
txt.print_uw(uw) ; txt.print_ub(ub)
txt.nl() ; txt.nl()
; pushw(32767)
uw=10000 ; popw(uw)
routines(44,uw+123) ; txt.print_uw(uw)
routines2(44,uw+123) ; txt.nl()
;
routine(uw+123, 22,33, true, 44) ; uw=10000
routine2(uw+123, 22,33, true, 44) ; 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() test_stack.test()