From 4c879e308827260f5d0aa037819a88a565db4cb4 Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Thu, 7 Jan 2010 17:01:01 +0000 Subject: Added warning for failed inlining when the targ... Added warning for failed inlining when the target is @inline annotated. No review necessary. --- .../scala/tools/nsc/backend/opt/Inliners.scala | 27 ++++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala index 8e77c493dd..4c9a996cec 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala @@ -278,10 +278,13 @@ abstract class Inliners extends SubComponent { assert(pending.isEmpty, "Pending NEW elements: " + pending) } + /** The current iclass */ + private var currentIClazz: IClass = _ + def analyzeClass(cls: IClass): Unit = if (settings.inline.value) { if (settings.debug.value) log("Analyzing " + cls); - + this.currentIClazz = cls cls.methods filterNot (_.symbol.isConstructor) foreach analyzeMethod } @@ -311,6 +314,12 @@ abstract class Inliners extends SubComponent { if (!retry) { i match { case CALL_METHOD(msym, Dynamic) => + def warnNoInline(reason: String) = { + if (msym.hasAnnotation(ScalaInlineAttr)) + currentIClazz.cunit.warning(i.pos, + "Could not inline required method %s because %s.".format(msym.originalName.decode, reason)) + } + val receiver = info.stack.types.drop(msym.info.paramTypes.length).head match { case REFERENCE(s) => s; case _ => NoSymbol; @@ -361,12 +370,18 @@ abstract class Inliners extends SubComponent { + "\n\tinc.code ne null: " + (inc.code ne null) + (if (inc.code ne null) "\n\tisSafeToInline(m, inc, info.stack): " + isSafeToInline(m, inc, info.stack) + "\n\tshouldInline heuristics: " + shouldInline(m, inc) else "")); + warnNoInline( + if (inc.code eq null) "bytecode was unavailable" + else if (!isSafeToInline(m, inc, info.stack)) "it is unsafe (target may reference private fields)" + else "a bug (run with -Ylog:inline -Ydebug for more information)") } case None => + warnNoInline("bytecode was not available") if (settings.debug.value) log("could not find icode\n\treceiver: " + receiver + "\n\tmethod: " + concreteMethod) } - } + } else + warnNoInline(if (icodes.available(receiver)) "it is not final" else "bytecode was not available") case _ => (); } @@ -375,14 +390,6 @@ abstract class Inliners extends SubComponent { if (tfa.stat) log(m.symbol.fullNameString + " iterations: " + tfa.iterations + " (size: " + m.code.blocks.length + ")") }} while (retry && count < 15) m.normalize -// } catch { -// case e => -// Console.println("############# Caught exception: " + e + " #################"); -// Console.println("\nMethod: " + m + -// "\nMethod owner: " + m.symbol.owner); -// e.printStackTrace(); -// m.dump -// throw e } -- cgit v1.2.3