diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2010-01-07 17:01:01 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2010-01-07 17:01:01 +0000 |
commit | 4c879e308827260f5d0aa037819a88a565db4cb4 (patch) | |
tree | 335a7265514dd818884c82950166bc5101b72f5e | |
parent | 677352f871b46d0e71ae00095808dbf83e7132d0 (diff) | |
download | scala-4c879e308827260f5d0aa037819a88a565db4cb4.tar.gz scala-4c879e308827260f5d0aa037819a88a565db4cb4.tar.bz2 scala-4c879e308827260f5d0aa037819a88a565db4cb4.zip |
Added warning for failed inlining when the targ...
Added warning for failed inlining when the target is @inline annotated.
No review necessary.
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/opt/Inliners.scala | 27 | ||||
-rw-r--r-- | src/library/scala/Predef.scala | 2 |
2 files changed, 18 insertions, 11 deletions
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 } diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index 73512e2688..1b9f4b75ba 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -140,7 +140,7 @@ object Predef extends LowPriorityImplicits { } class ArrowAssoc[A](x: A) { - def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y) + @inline def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y) def →[B](y: B): Tuple2[A, B] = ->(y) } implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x) |