diff options
author | Paul Phillips <paulp@improving.org> | 2011-02-03 05:37:05 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-02-03 05:37:05 +0000 |
commit | 961b881659c16c8b9e12497d522a576adbaaa0c9 (patch) | |
tree | f501bdc721278eff03d6ffa49ea514c5a6af4dbd | |
parent | fa7838568e703ad8df1e102d0aa2cf47e7311482 (diff) | |
download | scala-961b881659c16c8b9e12497d522a576adbaaa0c9.tar.gz scala-961b881659c16c8b9e12497d522a576adbaaa0c9.tar.bz2 scala-961b881659c16c8b9e12497d522a576adbaaa0c9.zip |
Enclosing method attributes.
have no constructor by the time genjvm rolls around, so NoSymbol
emerges. Maybe the author of these two lines was under the impression
that isClass == true implies isTrait == false, which it does not.
assert(enclClass.isClass)
val sym = enclClass.primaryConstructor
2) for reasons unknown the 0-arg constructor was hardcoded as the
enclosing constructor, which is the wrong signature in all cases but
that one. Closes #4211, review by dragos.
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 24 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/interpreter/Phased.scala | 5 |
2 files changed, 20 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 2562d37450..7c4deb78f4 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -291,7 +291,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid { private def addEnclosingMethodAttribute(jclass: JClass, clazz: Symbol) { val sym = clazz.originalEnclosingMethod if (sym.isMethod) { - log("enclosing method for %s is %s (%s)".format(clazz, sym, sym.enclClass)) + log("enclosing method for %s is %s (in %s)".format(clazz, sym, sym.enclClass)) jclass addAttribute fjbgContext.JEnclosingMethodAttribute( jclass, javaName(sym.enclClass), @@ -300,15 +300,21 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid { ) } else if (clazz.isAnonymousClass) { val enclClass = clazz.rawowner - assert(enclClass.isClass) + assert(enclClass.isClass, "" + enclClass) val sym = enclClass.primaryConstructor - log("enclosing method for %s is %s (%s)".format(clazz, sym, enclClass)) - jclass addAttribute fjbgContext.JEnclosingMethodAttribute( - jclass, - javaName(enclClass), - javaName(sym), - JMethodType.ARGLESS_VOID_FUNCTION - ) + if (sym == NoSymbol) + log("Ran out of room looking for an enclosing method for %s: no constructor here.".format( + enclClass, clazz) + ) + else { + log("enclosing method for %s is %s (in %s)".format(clazz, sym, enclClass)) + jclass addAttribute fjbgContext.JEnclosingMethodAttribute( + jclass, + javaName(enclClass), + javaName(sym), + javaType(sym).asInstanceOf[JMethodType] + ) + } } } diff --git a/src/compiler/scala/tools/nsc/interpreter/Phased.scala b/src/compiler/scala/tools/nsc/interpreter/Phased.scala index 0c46007131..1406d2af39 100644 --- a/src/compiler/scala/tools/nsc/interpreter/Phased.scala +++ b/src/compiler/scala/tools/nsc/interpreter/Phased.scala @@ -66,6 +66,11 @@ trait Phased { def apply[T](body: => T): T = atPhase(get)(body) def multi[T](body: => T): Seq[T] = multi map (ph => at(ph)(body)) def all[T](body: => T): Seq[T] = ats(PhaseName.all)(body) + def allshow[T](body: => T): Seq[T] = { + val pairs = atz(PhaseName.all)(body) + pairs foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) } + pairs map (_._2) + } def at[T](ph: PhaseName)(body: => T): T = { val saved = get |