diff options
author | Paul Phillips <paulp@improving.org> | 2009-08-03 11:41:17 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-08-03 11:41:17 +0000 |
commit | cf7a2f64f1357dcfa8ecf78ae8f29880c9fab214 (patch) | |
tree | fa588f8829c509e840ea4482ce04dba7d7dd70af /src | |
parent | 9780704595af0c861fed2a4233408335418cec81 (diff) | |
download | scala-cf7a2f64f1357dcfa8ecf78ae8f29880c9fab214.tar.gz scala-cf7a2f64f1357dcfa8ecf78ae8f29880c9fab214.tar.bz2 scala-cf7a2f64f1357dcfa8ecf78ae8f29880c9fab214.zip |
Re-enabled forwarders and moved the formerly fa...
Re-enabled forwarders and moved the formerly failing tests for #363 and
#1745 out of pending.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/Settings.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala | 19 |
2 files changed, 12 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala index c0b26ff620..f788151aef 100644 --- a/src/compiler/scala/tools/nsc/Settings.scala +++ b/src/compiler/scala/tools/nsc/Settings.scala @@ -734,7 +734,7 @@ trait ScalacSettings { val checkInit = BooleanSetting ("-Xcheckinit", "Add runtime checks on field accessors. Uninitialized accesses result in an exception being thrown.") val noassertions = BooleanSetting ("-Xdisable-assertions", "Generate no assertions and assumptions") val Xexperimental = BooleanSetting ("-Xexperimental", "Enable experimental extensions") - val forwarders = BooleanSetting ("-Xforwarders", "Generate static forwarders in mirror classes") + val noForwarders = BooleanSetting ("-Xno-forwarders", "Do not generate static forwarders in mirror classes") val future = BooleanSetting ("-Xfuture", "Turn on future language features") val genPhaseGraph = StringSetting ("-Xgenerate-phase-graph", "file", "Generate the phase graphs (outputs .dot files) to fileX.dot", "") val XlogImplicits = BooleanSetting ("-Xlog-implicits", "Show more info on why some implicits are not applicable") diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 9097b8b6b1..dcecbcbf80 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -202,18 +202,19 @@ abstract class GenJVM extends SubComponent { } } else { + // it must be a top level class (name contains no $s) + def isCandidateForForwarders(sym: Symbol): Boolean = + atPhase (currentRun.picklerPhase.next) { + !(sym.name.toString contains '$') && (sym hasFlag Flags.MODULE) && !sym.isImplClass && !sym.isNestedClass + } + val lmoc = c.symbol.linkedModuleOfClass // add static forwarders if there are no name conflicts; see bugs #363 and #1735 if (lmoc != NoSymbol && !c.symbol.hasFlag(Flags.INTERFACE)) { - // forwarders were creating many issues, see #1795 for instance; so for now - // they are only enabled if -Xforwarders is supplied to scalac... - if (settings.forwarders.value) { - log("Adding forwarders to existing class " + c.symbol + " found in module " + lmoc) + if (isCandidateForForwarders(lmoc) && !settings.noForwarders.value) { + log("Adding forwarders to existing class '%s' found in module '%s'".format(c.symbol, lmoc)) addForwarders(jclass, lmoc.moduleClass) } - // ...but we special case main so at least ticket #363 can continue to work. - // XXX we would like to, but doing so induces #1795 as surely as adding them all. - // else addForwarders(jclass, lmoc.moduleClass, _.name == nme.main) } } @@ -786,8 +787,10 @@ abstract class GenJVM extends SubComponent { if (settings.debug.value) log("Dumping mirror class for object: " + module); - for (m <- module.info.nonPrivateMembers; if shouldForward(m) ; if cond(m)) + for (m <- module.info.nonPrivateMembers; if shouldForward(m) ; if cond(m)) { + log("Adding static forwarder '%s' to '%s'".format(m, module)) addForwarder(jclass, module, m) + } } /** Dump a mirror class for a top-level module. A mirror class is a class containing |