| [#464] | project: nsc | priority: medium | category: bug | |
|---|---|---|---|---|
| submitter | assigned to | status | date submitted | |
| Iulian | _ | fixed | 2005-10-26 15:32:50.0 | |
| subject | Non-local super calls are not lifted | |||
| code |
class A {
def transform() = ();
}
class B extends A {
def atPhase(str: String)(bl: => Unit): Unit = bl;
override def transform() = {
atPhase("0")(super.transform());
}
} |
|||
| what happened | The call to 'super.transform()' should refer to B.super, but after the closure gets created and lifted, super wi\ ll be interpreted as anonfun0.super, which of course, does not contain a transform method. This is a tricky thin\ g, because super calls have to be made from a subclass of the 'desired' class (in this case, somewhere in B). |
|||
| what expected | I think a scheme similar to what is done for mixins. Or, forbid super calls in closures, the same way 'return' are not allowed in scalac. | |||
| [back to overview] | ||||
| Iulian edited on 2005-10-26 16:14:21.0 |
| Iulian edited on 2005-10-27 09:49:33.0 |
I think this should make things a bit clearer. Here's the output of scalac after erasure, for the given example:
class B$class() extends A$class() with B() {
override def transform(): void = B$class.this.atPhase("0", {
(I erased uninteresting parts).
On this example, scalac creates a super accessor method in B, which is called by the closer's apply method. NSC does nothing special about super. I think scalac's behavior is the right one.
|
| Iulian edited on 2005-11-04 10:36:45.0 |