8000 Avoid indirection through bridges · scala/scala@0c04d64 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0c04d64

Browse files
committed
Avoid indirection through bridges
1 parent 27e4140 commit 0c04d64

19 files changed

+92
-83
lines changed

src/compiler/scala/tools/nsc/ast/Trees.scala

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
2626
override def isDef = definition.isDef
2727
override def isTerm = definition.isTerm
2828
override def isType = definition.isType
29-
override def transform(transformer: InternalTransformer): Tree =
29+
override def transform(transformer: ApiTransformer): Tree =
3030
transformer.treeCopy.DocDef(this, comment, transformer.transform(definition))
3131
override def traverse(traverser: Traverser): Unit = {
3232
traverser.traverse(definition)
@@ -36,7 +36,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
3636
/** Array selection `<qualifier> . <name>` only used during erasure */
3737
case class SelectFromArray(qualifier: Tree, name: Name, erasure: Type)
3838
extends RefTree with TermTree {
39-
override def transform(transformer: InternalTransformer): Tree =
39+
override def transform(transformer: ApiTransformer): Tree =
4040
transformer.treeCopy.SelectFromArray(
4141
this, transformer.transform(qualifier), name, erasure)
4242
override def traverse(traverser: Traverser): Unit = {
@@ -49,7 +49,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
4949
*/
5050
case class InjectDerivedValue(arg: Tree)
5151
extends SymTree with TermTree {
52-
override def transform(transformer: InternalTransformer): Tree =
52+
override def transform(transformer: ApiTransformer): Tree =
5353
transformer.treeCopy.InjectDerivedValue(this, transformer.transform(arg))
5454
override def traverse(traverser: Traverser): Unit = {
5555
traverser.traverse(arg)
@@ -60,7 +60,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
6060

6161
/** emitted by typer, eliminated by refchecks */
6262
case class TypeTreeWithDeferredRefCheck()(val check: () => TypeTree) extends TypTree {
63-
override def transform(transformer: InternalTransformer): Tree =
63+
override def transform(transformer: ApiTransformer): Tree =
6464
transformer.treeCopy.TypeTreeWithDeferredRefCheck(this)
6565
override def traverse(traverser: Traverser): Unit = {
6666
// (and rewrap the result? how to update the deferred check? would need to store wrapped tree instead of returning it from check)
@@ -149,8 +149,8 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
149149
}
150150
}
151151

152-
type InternalTransformer = super.Transformer
153-
class Transformer extends super.Transformer {
152+
type ApiTransformer = super.Transformer
153+
class Transformer extends InternalTransformer {
154154
def transformUnit(unit: CompilationUnit) {
155155 F438
try unit.body = transform(unit.body)
156156
catch {
@@ -226,7 +226,7 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
226226
}
227227
}
228228

229-
class MarkLocals extends self.Traverser {
229+
class MarkLocals extends self.InternalTraverser {
230230
def markLocal(tree: Tree) {
231231
if (tree.symbol != null && tree.symbol != NoSymbol) {
232232
val sym = tree.symbol
@@ -251,16 +251,16 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
251251
tree
252252
}
253253

254-
super.traverse(tree)
254+
tree.traverse(this)
255255
}
256256
}
257257

258258
class Transformer extends self.Transformer {
259259
override def transform(tree: Tree): Tree = {
260260
if (leaveAlone != null && leaveAlone(tree))
261261
tree
262-
else
263-
super.transform {
262+
else {
263+
val tree1 = {
264264
tree match {
265265
case tree if !tree.canHaveAttrs =>
266266
tree
@@ -312,6 +312,8 @@ trait Trees extends scala.reflect.internal.Trees { self: Global =>
312312
dupl.clearType()
313313
}
314314
}
315+
tree1.transform(this)
316+
}
315317
}
316318
}
317319

src/compiler/scala/tools/nsc/backend/jvm/BCodeIdiomatic.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ abstract class BCodeIdiomatic extends SubComponent {
640640
* The entry-value for a LabelDef entry-key always contains the entry-key.
641641
*
642642
*/
643-
class LabelDefsFinder(rhs: Tree) extends Traverser {
643+
class LabelDefsFinder(rhs: Tree) extends InternalTraverser {
644644
val result = mutable.AnyRefMap.empty[Tree, List[LabelDef]]
645645
var acc: List[LabelDef] = Nil
646646
var directResult: List[LabelDef] = Nil
@@ -654,7 +654,7 @@ abstract class BCodeIdiomatic extends SubComponent {
654654
override def traverse(tree: Tree) {
655655
val saved = acc
656656
acc = Nil
657-
super.traverse(tree)
657+
tree.traverse(this)
658658
// acc contains all LabelDefs found under (but not at) `tree`
659659
tree match {
660660
case lblDf: LabelDef => acc ::= lblDf

src/compiler/scala/tools/nsc/transform/CleanUp.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ abstract class CleanUp extends Statics with Transform with ast.TreeDSL {
374374
// collecting symbols for entry points here (as opposed to GenBCode where they are used)
375375
// has the advantage of saving an additional pass over all ClassDefs.
376376
entryPoints ::= tree.symbol
377-
super.transform(tree)
377+
tree.transform(this)
378378

379379
/* Transforms dynamic calls (i.e. calls to methods that are undefined
380380
* in the erased type space) to -- dynamically -- unsafe calls using
@@ -454,23 +454,23 @@ abstract class CleanUp extends Statics with Transform with ast.TreeDSL {
454454
case Apply(fn @ Select(qual, _), (arg @ Literal(Constant(symname: String))) :: Nil)
455455
if treeInfo.isQualifierSafeToElide(qual) && fn.symbol == Symbol_apply && !currentClass.isTrait =>
456456

457-
super.transform(treeCopy.ApplyDynamic(tree, atPos(fn.pos)(Ident(SymbolLiteral_dummy).setType(SymbolLiteral_dummy.info)), LIT(SymbolLiteral_bootstrap) :: arg :: Nil))
457+
treeCopy.ApplyDynamic(tree, atPos(fn.pos)(Ident(SymbolLiteral_dummy).setType(SymbolLiteral_dummy.info)), LIT(SymbolLiteral_bootstrap) :: arg :: Nil).transform(this)
458458

459459
// Drop the TypeApply, which was used in Erasure to make `synchronized { ... } ` erase like `...`
460460
// (and to avoid boxing the argument to the polymorphic `synchronized` method).
461461
case app@Apply(TypeApply(fun, _), args) if fun.symbol == Object_synchronized =>
462-
super.transform(treeCopy.Apply(app, fun, args))
462+
treeCopy.Apply(app, fun, args).transform(this)
463463

464464
// Replaces `Array(Predef.wrapArray(ArrayValue(...).$asInstanceOf[...]), <tag>)`
465465
// with just `ArrayValue(...).$asInstanceOf[...]`
466466
//
467467
// See scala/bug#6611; we must *only* do this for literal vararg arrays.
468468
case Apply(appMeth, List(Apply(wrapRefArrayMeth, List(arg @ StripCast(ArrayValue(_, _)))), _))
469469
if wrapRefArrayMeth.symbol == currentRun.runDefinitions.Predef_wrapRefArray && appMeth.symbol == ArrayModule_genericApply =>
470-
super.transform(arg)
470+
arg.transform(this)
471471
case Apply(appMeth, List(elem0, Apply(wrapArrayMeth, List(rest @ ArrayValue(elemtpt, _)))))
472472
if wrapArrayMeth.symbol == Predef_wrapArray(elemtpt.tpe) && appMeth.symbol == ArrayModule_apply(elemtpt.tpe) =>
473-
super.transform(treeCopy.ArrayValue(rest, rest.elemtpt, elem0 :: rest.elems))
473+
treeCopy.ArrayValue(rest, rest.elemtpt, elem0 :: rest.elems).transform(this)
474474

475475
case _ =>
476476
super.transform(tree)

src/compiler/scala/tools/nsc/transform/Constructors.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ abstract class Constructors extends Statics with Transform with TypingTransforme
169169
val omittables = mutable.Set.empty[Symbol] ++ (decls filter (sym => omittableParamAcc(sym) || omittableOuterAcc(sym))) // the closure only captures isEffectivelyFinal
170170

171171
// no point traversing further once omittables is empty, all candidates ruled out already.
172-
object detectUsages extends Traverser {
172+
object detectUsages extends InternalTraverser {
173173
lazy val bodyOfOuterAccessor = defs.collect{ case dd: DefDef if omittableOuterAcc(dd.symbol) => dd.symbol -> dd.rhs }.toMap
174174

175175
override def traverse(tree: Tree): Unit =
@@ -179,8 +179,8 @@ abstract class Constructors extends Statics with Transform with TypingTransforme
179179
case _: DefDef if (sym.owner eq clazz) && omittableOuterAcc(sym) => // don't mark as "needed" the field supporting this outer-accessor (not just yet)
180180
case _: Select if omittables(sym) => omittables -= sym // mark usage
181181
bodyOfOuterAccessor get sym foreach traverse // recurse to mark as needed the field supporting the outer-accessor-method
182-
super.traverse(tree)
183-
case _ => super.traverse(tree)
182+
tree.traverse(this)
183+
case _ => tree.traverse(this)
184184
}
185185
}
186186
}

src/compiler/scala/tools/nsc/transform/Delambdafy.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
300300
// A traverser that finds symbols used but not defined in the given Tree
301301
// TODO freeVarTraverser in LambdaLift does a very similar task. With some
302302
// analysis this could probably be unified with it
303-
class FreeVarTraverser extends Traverser {
303+
class FreeVarTraverser extends InternalTraverser {
304304
val freeVars = mutable.LinkedHashSet[Symbol]()
305305
val declared = mutable.LinkedHashSet[Symbol]()
306306

@@ -317,7 +317,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
317317
if ((sym != NoSymbol) && sym.isLocalToBlock && sym.isTerm && !sym.isMethod && !declared.contains(sym)) freeVars += sym
318318
case _ =>
319319
}
320-
super.traverse(tree)
320+
tree.traverse(this)
321321
}
322322
}
323323

@@ -330,7 +330,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
330330
}
331331

332332
// finds all methods that reference 'this'
333-
class ThisReferringMethodsTraverser extends Traverser {
333+
class ThisReferringMethodsTraverser extends InternalTraverser {
334334
// the set of methods that refer to this
335335
private val thisReferringMethods = mutable.Set[Symbol]()
336336

@@ -371,7 +371,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
371371
// we don't expect defs within defs. At this phase trees should be very flat
372372
if (currentMethod.exists) devWarning("Found a def within a def at a phase where defs are expected to be flattened out.")
373373
currentMethod = tree.symbol
374-
super.traverse(tree)
374+
tree.traverse(this)
375375
currentMethod = NoSymbol
376376
case fun@Function(_, _) =>
377377
// we don't drill into functions because at the beginning of this phase they will always refer to 'this'.
@@ -382,7 +382,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
382382
if (currentMethod.exists) liftedMethodReferences(currentMethod) += sel.symbol
383383
super.traverseTrees(args)
384384
case Apply(fun, outer :: rest) if shouldElideOuterArg(fun.symbol, outer) =>
385-
super.traverse(fun)
385+
fun.traverse(this)
386386
super.traverseTrees(rest)
387387
case This(_) =>
388388
if (currentMethod.exists && tree.symbol == currentMethod.enclClass) {
@@ -392,7 +392,7 @@ abstract class Delambdafy extends Transform with TypingTransformers with ast.Tre
392392
case _: ClassDef if !tree.symbol.isTopLevel =>
393393
case _: DefDef =>
394394
case _ =>
395-
super.traverse(tree)
395+
tree.traverse(this)
396396
}
397397
}
398398
}

src/compiler/scala/tools/nsc/transform/Erasure.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ abstract class Erasure extends InfoTransform
433433
case _ =>
434434
tree
435435
}
436-
super.transform(tree1)
436+
tree1.transform(this)
437437
}
438438
}
439439

src/compiler/scala/tools/nsc/transform/Flatten.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ abstract class Flatten extends InfoTransform {
118118
tree match {
119119
case PackageDef(_, _) =>
120120
liftedDefs(tree.symbol.moduleClass) = new ListBuffer
121-
super.transform(tree)
121+
tree.transform(this)
122122
case Template(_, _, _) if tree.symbol.isDefinedInPackage =>
123123
liftedDefs(tree.symbol.owner) = new ListBuffer
124-
super.transform(tree)
124+
tree.transform(this)
125125
case ClassDef(_, _, _, _) if tree.symbol.isNestedClass =>
126126
// scala/bug#5508 Ordering important. In `object O { trait A { trait B } }`, we want `B` to appear after `A` in
127127
// the sequence of lifted trees in the enclosing package. Why does this matter? Currently, mixin
@@ -134,12 +134,12 @@ abstract class Flatten extends InfoTransform {
134134
// - move the accessor creation to the Mixin info transformer
135135
val liftedBuffer = liftedDefs(tree.symbol.enclosingTopLevelClass.owner)
136136
val index = liftedBuffer.length
137-
liftedBuffer.insert(index, super.transform(tree))
137+
liftedBuffer.insert(index, tree.transform(this))
138138
if (tree.symbol.sourceModule.isStaticModule)
139139
removeSymbolInCurrentScope(tree.symbol.sourceModule)
140140
EmptyTree
141141
case _ =>
142-
super.transform(tree)
142+
tree.transform(this)
143143
}
144144
}
145145

src/compiler/scala/tools/nsc/transform/LambdaLift.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ abstract class LambdaLift extends InfoTransform {
186186
}
187187

188188
/** The traverse function */
189-
private val freeVarTraverser = new Traverser {
189+
private val freeVarTraverser = new InternalTraverser {
190190
override def traverse(tree: Tree) {
191191
// try { //debug
192192
val sym = tree.symbol
@@ -217,7 +217,7 @@ abstract class LambdaLift extends InfoTransform {
217217
markCalled(sym, logicallyEnclosingMember(currentOwner))
218218
case _ =>
219219
}
220-
super.traverse(tree)
220+
tree.traverse(this)
221221
// } catch {//debug
222222
// case ex: Throwable =>
223223
// Console.println(s"$ex while traversing $tree")

src/compiler/scala/tools/nsc/transform/Mixin.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL with AccessorSynthes
430430
val singleUseFields: Map[Symbol, List[Symbol]] = {
431431
val usedIn = mutable.HashMap[Symbol, List[Symbol]]() withDefaultValue Nil
432432

433-
object SingleUseTraverser extends Traverser {
433+
object SingleUseTraverser extends InternalTraverser {
434434
override def traverse(tree: Tree) {
435435
tree match {
436436
// assignment targets don't count as a dereference -- only check the rhs
@@ -445,8 +445,8 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL with AccessorSynthes
445445
// println("added use in: " + currentOwner + " -- " + tree)
446446
usedIn(sym) ::= currentOwner
447447
}
448-
super.traverse(tree)
449-
case _ => super.traverse(tree)
448+
tree.traverse(this)
449+
case _ => tree.traverse(this)
450450
}
451451
}
452452
}
@@ -595,7 +595,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL with AccessorSynthes
595595
*/
596596
override def transform(tree: Tree): Tree = {
597597
val saved = localTyper
598-
val tree1 = super.transform(preTransform(tree))
598+
val tree1 = preTransform(tree).transform(this)
599599
// localTyper needed when not flattening inner classes. parts after an
600600
// inner class will otherwise be typechecked with a wrong scope
601601
try exitingMixin(postTransform(tree1))

src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
14631463

14641464
/** Collect method bodies that are concrete specialized methods.
14651465
*/
1466-
class CollectMethodBodies extends Traverser {
1466+
class CollectMethodBodies extends InternalTraverser {
14671467
override def traverse(tree: Tree) = tree match {
14681468
case DefDef(_, _, _, vparams :: Nil, _, rhs) =>
14691469
if (concreteSpecMethods(tree.symbol) || tree.symbol.isConstructor) {
@@ -1479,7 +1479,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
14791479
// log("!!! adding body of a valdef " + tree.symbol + ": " + rhs)
14801480
//super.traverse(tree)
14811481
case _ =>
1482-
super.traverse(tree)
1482+
tree.traverse(this)
14831483
}
14841484
}
14851485

src/compiler/scala/tools/nsc/transform/TailCalls.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ abstract class TailCalls extends Transform {
276276
tree match {
277277
case dd: DefDef if tree.symbol.isLazy && tree.symbol.hasAnnotation(TailrecClass) =>
278278
reporter.error(tree.pos, "lazy vals are not tailcall transformed")
279-
super.transform(tree)
279+
tree.transform(this)
280280

281281
case dd @ DefDef(_, name, _, vparamss0, _, rhs0) if isEligible(dd) =>
282282
val newCtx = new DefDefTailContext(dd)
@@ -403,7 +403,7 @@ abstract class TailCalls extends Transform {
403403
case EmptyTree | Super(_, _) | This(_) | Ident(_) | Literal(_) | Function(_, _) | TypeTree() =>
404404
tree
405405
case _ =>
406-
super.transform(tree)
406+
tree.transform(this)
407407
}
408408
}
409409

src/compiler/scala/tools/nsc/transform/TypingTransformers.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ trait TypingTransformers {
3737
tree match {
3838
case Template(_, _, _) =>
3939
// enter template into context chain
40-
atOwner(currentOwner) { super.transform(tree) }
40+
atOwner(currentOwner) { tree.transform(this) }
4141
case PackageDef(_, _) =>
42-
atOwner(tree.symbol) { super.transform(tree) }
42+
atOwner(tree.symbol) { tree.transform(this) }
4343
case _ =>
44-
super.transform(tree)
44+
tree.transform(this)
4545
}
4646
}
4747
}

src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ trait MatchTreeMaking extends MatchCodeGen with Debugging {
623623
// TODO: do this during tree construction, but that will require tracking the current owner in treemakers
624624
// TODO: assign more fine-grained positions
625625
// fixes symbol nesting, assigns positions
626-
protected def fixerUpper(origOwner: Symbol, pos: Position) = new Traverser {
626+
protected def fixerUpper(origOwner: Symbol, pos: Position) = new InternalTraverser {
627627
currentOwner = origOwner
628628

629629
override def traverse(t: Tree) {
@@ -646,7 +646,7 @@ trait MatchTreeMaking extends MatchCodeGen with Debugging {
646646
debug.patmat("untouched "+ ((t, t.getClass, t.symbol.ownerChain, currentOwner.ownerChain)))
647647
case _ =>
648648
}
649-
super.traverse(t)
649+
t.traverse(this)
650650
}
651651

652652
// override def apply

src/compiler/scala/tools/nsc/transform/patmat/PatternMatching.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ trait Interface extends ast.TreeDSL {
237237

238238
val tree1 = tree match {
239239
case Ident(_) => subst(from, to)
240-
case _ => super.transform(tree)
240+
case _ => tree.transform(this)
241241
}
242242
tree1 match {
243243
case _: DefTree =>

src/compiler/scala/tools/nsc/typechecker/Analyzer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ trait Analyzer extends AnyRef
5656
override val checkable = false
5757
import global._
5858

59-
val openPackageObjectsTraverser = new Traverser {
59+
val openPackageObjectsTraverser = new Int 722A ernalTraverser {
6060
override def traverse(tree: Tree): Unit = tree match {
6161
case ModuleDef(_, _, _) =>
6262
if (tree.symbol.name == nme.PACKAGEkw) {
6363
openPackageModule(tree.symbol, tree.symbol.owner)
6464
}
6565
case ClassDef(_, _, _, _) => () // make it fast
66-
case _ => super.traverse(tree)
66+
case _ => tree.traverse(this)
6767
}
6868
}
6969

0 commit comments

Comments
 (0)
0