summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-02-03 05:37:05 +0000
committerPaul Phillips <paulp@improving.org>2011-02-03 05:37:05 +0000
commit961b881659c16c8b9e12497d522a576adbaaa0c9 (patch)
treef501bdc721278eff03d6ffa49ea514c5a6af4dbd /src
parentfa7838568e703ad8df1e102d0aa2cf47e7311482 (diff)
downloadscala-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.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala24
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Phased.scala5
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