diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e855f19..ec09e7ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ * Fixed optimizations removing pointless stores to local variables. +* Fixed name clashes when passing parameters to functions. + * Fixed `#use` not accessing all preprocessor parameters. * Fixed `#pragma` not respecting `#if`. diff --git a/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala b/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala index 5f22e976..f9f0554d 100644 --- a/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala @@ -29,7 +29,7 @@ class AbstractExpressionCompiler[T <: AbstractCode] { def callingContext(ctx: CompilationContext, callee: String, v: VariableInMemory): CompilationContext = { val result = new Environment(Some(ctx.env), "", ctx.options.platform.cpuFamily, ctx.options) - val localName = v.name.stripPrefix(callee + '$') + val localName = v.name + "`aa" result.addVariable(ctx.options, localName, v, None) ctx.copy(env = result) } diff --git a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala index 0f6601ab..f46ff6a9 100644 --- a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala @@ -1404,7 +1404,7 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] { params.zip(paramVars).flatMap { case (paramExpr, paramVar) => val callCtx = callingContext(ctx, function.name, paramVar) - compileAssignment(callCtx, paramExpr, VariableExpression(paramVar.name)) + compileAssignment(callCtx, paramExpr, VariableExpression(paramVar.name + "`aa")) } ++ List(AssemblyLine.absoluteOrLongAbsolute(JSR, function, ctx.options)) } result diff --git a/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala b/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala index ecf1fd00..3d4b665d 100644 --- a/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala @@ -975,11 +975,11 @@ object Z80ExpressionCompiler extends AbstractExpressionCompiler[ZLine] { val callCtx = callingContext(ctx, function.name, paramVar) paramVar.typ.size match { case 1 => - compileToA(ctx, paramExpr) ++ storeA(callCtx, VariableExpression(paramVar.name), paramVar.typ.isSigned) + compileToA(ctx, paramExpr) ++ storeA(callCtx, VariableExpression(paramVar.name + "`aa"), paramVar.typ.isSigned) case 2 => - compileToHL(ctx, paramExpr) ++ storeHL(callCtx, VariableExpression(paramVar.name), paramVar.typ.isSigned) + compileToHL(ctx, paramExpr) ++ storeHL(callCtx, VariableExpression(paramVar.name + "`aa"), paramVar.typ.isSigned) case _ => - storeLarge(callCtx, VariableExpression(paramVar.name), paramExpr) + storeLarge(callCtx, VariableExpression(paramVar.name + "`aa"), paramExpr) } } ++ List(ZLine(CALL, NoRegisters, function.toAddress)) } diff --git a/src/main/scala/millfork/env/Environment.scala b/src/main/scala/millfork/env/Environment.scala index e95e3c16..9c9e410a 100644 --- a/src/main/scala/millfork/env/Environment.scala +++ b/src/main/scala/millfork/env/Environment.scala @@ -214,6 +214,12 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa } } + private def addThing(localName: String, t: Thing, position: Option[Position]): Unit = { + if (assertNotDefined(t.name, position)) { + things(localName) = t + } + } + def getReturnedVariables(statements: Seq[Statement]): Set[String] = { statements.flatMap { case ReturnStatement(Some(VariableExpression(v))) => Set(v) @@ -1499,19 +1505,19 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa def addVariable(options: CompilationOptions, localName: String, variable: Variable, position: Option[Position]): Unit = { variable match { case v: StackVariable => - addThing(v, position) + addThing(localName, v, position) for ((suffix, offset, t) <- getSubvariables(v.typ)) { addThing(StackVariable(prefix + localName + suffix, t, baseStackOffset + offset), position) } case v: MemoryVariable => - addThing(v, position) + addThing(localName, v, position) for ((suffix, offset, t) <- getSubvariables(v.typ)) { val subv = RelativeVariable(prefix + localName + suffix, v.toAddress + offset, t, zeropage = v.zeropage, declaredBank = v.declaredBank, isVolatile = v.isVolatile) addThing(subv, position) registerAddressConstant(subv, position, options, Some(t)) } case v: VariableInMemory => - addThing(v, position) + addThing(localName, v, position) addThing(ConstantThing(v.name + "`", v.toAddress, get[Type]("word")), position) for ((suffix, offset, t) <- getSubvariables(v.typ)) { val subv = RelativeVariable(prefix + localName + suffix, v.toAddress + offset, t, zeropage = v.zeropage, declaredBank = v.declaredBank, isVolatile = v.isVolatile)