From 2fe5bcfe6d995290e79a67d58a2a6b9ac1007b98 Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Thu, 24 Sep 2020 18:05:44 +0200 Subject: [PATCH 1/2] Tweak performance of findRef --- .../src/dotty/tools/dotc/typer/Typer.scala | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/typer/Typer.scala b/compiler/src/dotty/tools/dotc/typer/Typer.scala index f414c0aadf3a..3099660b951c 100644 --- a/compiler/src/dotty/tools/dotc/typer/Typer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Typer.scala @@ -503,15 +503,16 @@ class Typer extends Namer // Convert a reference `f` to an extension method select `p.f`, where // `p` is the closest enclosing extension parameter, or else convert to `this.f`. val xmethod = ctx.owner.enclosingExtensionMethod - val qualifier = - if xmethod.exists then untpd.ref(xmethod.extensionParam.termRef) - else untpd.This(untpd.EmptyTypeIdent) - val selection = untpd.cpy.Select(tree)(qualifier, name) - val result = tryEither(typed(selection, pt))((_, _) => fail) - def canAccessUnqualified(sym: Symbol) = - sym.is(ExtensionMethod) && (sym.extensionParam.span == xmethod.extensionParam.span) - if !xmethod.exists || result.tpe.isError || canAccessUnqualified(result.symbol) then - result + if xmethod.exists then + val qualifier = untpd.ref(xmethod.extensionParam.termRef) + val selection = untpd.cpy.Select(tree)(qualifier, name) + val result = tryEither(typed(selection, pt))((_, _) => fail) + def canAccessUnqualified(sym: Symbol) = + sym.is(ExtensionMethod) && (sym.extensionParam.span == xmethod.extensionParam.span) + if result.tpe.isError || canAccessUnqualified(result.symbol) then + result + else + fail else fail else From db92078bc77e6b33c9b648a5dc8ad84ab5d5929c Mon Sep 17 00:00:00 2001 From: Liu Fengyun Date: Fri, 25 Sep 2020 11:17:16 +0200 Subject: [PATCH 2/2] Add find ref as a bench test --- tests/bench/FindRef.scala | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/bench/FindRef.scala diff --git a/tests/bench/FindRef.scala b/tests/bench/FindRef.scala new file mode 100644 index 000000000000..07db87f577ff --- /dev/null +++ b/tests/bench/FindRef.scala @@ -0,0 +1,11 @@ +class MyInt(val x: Int) { + def eq(that: MyInt): Boolean = this.x == that.x +} + +class Test { + def foo(x: MyInt, y: MyInt): Boolean = x.eq(y) + + val a = MyInt(2) + val b = MyInt(3) + foo(a, b) +} \ No newline at end of file