From 61a64490218901af7b70f61c17d8d904b38a6a2d Mon Sep 17 00:00:00 2001 From: Fengyun Liu Date: Sat, 27 May 2023 07:56:24 +0200 Subject: [PATCH] Address review: factor out isByNameParam --- .../tools/dotc/transform/init/Objects.scala | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/init/Objects.scala b/compiler/src/dotty/tools/dotc/transform/init/Objects.scala index 9ec9a23d76ce..bc0f5a61c568 100644 --- a/compiler/src/dotty/tools/dotc/transform/init/Objects.scala +++ b/compiler/src/dotty/tools/dotc/transform/init/Objects.scala @@ -635,7 +635,7 @@ object Objects: * @param ctor The symbol of the target method. * @param args Arguments of the constructor call (all parameter blocks flatten to a list). */ - def callConstructor(thisV: Value, ctor: Symbol, args: List[ArgInfo]): Contextual[Value] = log("call " + ctor.show + ", args = " + args.map(_.value.show), printer, (_: Value).show) { + def callConstructor(thisV: Value, ctor: Symbol, args: List[ArgInfo]): Contextual[Unit] = log("call " + ctor.show + ", args = " + args.map(_.value.show), printer, (_: Value).show) { thisV match case ref: Ref => @@ -648,7 +648,6 @@ object Objects: if ctor.isPrimaryConstructor then val tpl = cls.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template] extendTrace(cls.defTree) { eval(tpl, ref, cls, cacheResult = true) } - ref else extendTrace(ddef) { eval(ddef.rhs, ref, cls, cacheResult = true) } else @@ -817,6 +816,7 @@ object Objects: * @param sym The symbol of the variable. */ def readLocal(thisV: Value, sym: Symbol): Contextual[Value] = log("reading local " + sym.show, printer, (_: Value).show) { + def isByNameParam(sym: Symbol) = sym.is(Flags.Param) && sym.info.isInstanceOf[ExprType] Env.resolveEnv(sym.enclosingMethod, thisV, summon[Env.Data]) match case Some(thisV -> env) => if sym.is(Flags.Mutable) then @@ -837,7 +837,7 @@ object Objects: try // Assume forward reference check is doing a good job val value = Env.valValue(sym) - if sym.is(Flags.Param) && sym.info.isInstanceOf[ExprType] then + if isByNameParam(sym) then value match case fun: Fun => given Env.Data = fun.env @@ -856,7 +856,7 @@ object Objects: Bottom case _ => - if sym.is(Flags.Param) && sym.info.isInstanceOf[ExprType] then + if isByNameParam(sym) then report.warning("Calling cold by-name alias. Call trace: \n" + Trace.show, Trace.position) Bottom else @@ -988,7 +988,7 @@ object Objects: case Select(qual, _) => val receiver = eval(qual, thisV, klass) if ref.symbol.isConstructor then - withTrace(trace2) { callConstructor(receiver, ref.symbol, args) } + withTrace(trace2) { callConstructor(receiver, ref.symbol, args); Bottom } else withTrace(trace2) { call(receiver, ref.symbol, args, receiver = qual.tpe, superType = NoType) } @@ -1003,7 +1003,7 @@ object Objects: case TermRef(prefix, _) => val receiver = withTrace(trace2) { evalType(prefix, thisV, klass) } if id.symbol.isConstructor then - withTrace(trace2) { callConstructor(receiver, id.symbol, args) } + withTrace(trace2) { callConstructor(receiver, id.symbol, args); Bottom } else withTrace(trace2) { call(receiver, id.symbol, args, receiver = prefix, superType = NoType) } @@ -1089,10 +1089,10 @@ object Objects: eval(expr, thisV, klass) case Try(block, cases, finalizer) => - eval(block, thisV, klass) + val res = evalExprs(block :: cases.map(_.body), thisV, klass).join if !finalizer.isEmpty then eval(finalizer, thisV, klass) - evalExprs(cases.map(_.body), thisV, klass).join + res case SeqLiteral(elems, elemtpt) => evalExprs(elems, thisV, klass).join @@ -1259,7 +1259,6 @@ object Objects: tasks.append { () => printer.println("init super class " + cls.show) callConstructor(thisV, ctor, args) - () } // parents