From 49eac6eab9a58a7d59088db91e104a8f3b0ecd78 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 29 Sep 2015 18:17:48 +0200 Subject: [PATCH 1/5] Typer: remove unused TyperContextOps --- src/dotty/tools/dotc/typer/Typer.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala index a3c64f526379..9e5842b6895a 100644 --- a/src/dotty/tools/dotc/typer/Typer.scala +++ b/src/dotty/tools/dotc/typer/Typer.scala @@ -33,8 +33,6 @@ import util.Stats.{track, record} import config.Printers._ import language.implicitConversions -trait TyperContextOps { ctx: Context => } - object Typer { /** The precedence of bindings which determines which of several bindings will be From ffe77a4364e7a4bfa7fdcc9e1fa75bd4fcd8abb7 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 29 Sep 2015 18:18:34 +0200 Subject: [PATCH 2/5] UnpickleScala2: Scala modules do not set Lazy Flag. Dotty modules do. --- src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala b/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala index b080a97b6e94..0f5d4bb917be 100644 --- a/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala +++ b/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala @@ -287,7 +287,7 @@ object PickleBuffer { val shift = ChunkBits val mask = ChunkSize - 1 assert(6 * ChunkBits == ScalaFlagEnd) - FlagSet( + val t = FlagSet( map(0)((sflags >>> (shift * 0)).toInt & mask) | map(1)((sflags >>> (shift * 1)).toInt & mask) | map(2)((sflags >>> (shift * 2)).toInt & mask) | @@ -295,5 +295,8 @@ object PickleBuffer { map(4)((sflags >>> (shift * 4)).toInt & mask) | map(5)((sflags >>> (shift * 5)).toInt & mask) ) + if (!isType && t.is(Module, Lazy)) + t | Lazy // scala2 modules do not always set lazy flag. Dotty modules do + else t } } From 80f8c1b06277321629da9afbfc66f4675187d18c Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 29 Sep 2015 18:19:17 +0200 Subject: [PATCH 3/5] ExplicitOuter: Scala2 inner modules always require outer pointer. --- src/dotty/tools/dotc/transform/ExplicitOuter.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/src/dotty/tools/dotc/transform/ExplicitOuter.scala index eb231bfe730e..daf8c85d20c6 100644 --- a/src/dotty/tools/dotc/transform/ExplicitOuter.scala +++ b/src/dotty/tools/dotc/transform/ExplicitOuter.scala @@ -117,8 +117,6 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf object ExplicitOuter { import ast.tpd._ - private val LocalInstantiationSite = Module | Private - /** Ensure that class `cls` has outer accessors */ def ensureOuterAccessors(cls: ClassSymbol)(implicit ctx: Context): Unit = { //todo: implementing #165 would simplify this logic @@ -176,7 +174,8 @@ object ExplicitOuter { /** Class is always instantiated in the compilation unit where it is defined */ private def hasLocalInstantiation(cls: ClassSymbol)(implicit ctx: Context): Boolean = - cls.owner.isTerm || cls.is(LocalInstantiationSite) + // scala2x modules always take an outer pointer(as of 2.11) + cls.owner.isTerm || cls.is(Private) || cls.is(Module, Scala2x) /** The outer parameter accessor of cass `cls` */ private def outerParamAccessor(cls: ClassSymbol)(implicit ctx: Context): TermSymbol = From a5db9c71ce9be1bbfb745f5da088324c9510350c Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 29 Sep 2015 18:19:49 +0200 Subject: [PATCH 4/5] Mixin: materialise rhs for inherited scala2 modules --- src/dotty/tools/dotc/transform/Mixin.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index ae4e261775f1..0094e69654e6 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -216,7 +216,9 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => val rhs = if (ctx.atPhase(thisTransform)(implicit ctx => getter.is(ParamAccessor))) nextArgument() else if (isScala2x) - if (getter.is(Lazy)) lazyGetterCall + if (getter.is(Lazy, Module)) lazyGetterCall + else if (getter.is(Module)) + New(getter.info.resultType, List(This(cls))) else Underscore(getter.info.resultType) else transformFollowing(superRef(initializer(getter)).appliedToNone) // transformFollowing call is needed to make memoize & lazy vals run From db354748e387f664db4eae2aa61e1a17037548e8 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Mon, 12 Oct 2015 11:11:10 +0200 Subject: [PATCH 5/5] Address reviewer comments #811. --- .../tools/dotc/core/unpickleScala2/PickleBuffer.scala | 7 ++----- src/dotty/tools/dotc/transform/ExplicitOuter.scala | 3 ++- src/dotty/tools/dotc/transform/Mixin.scala | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala b/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala index 0f5d4bb917be..17fef3852a66 100644 --- a/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala +++ b/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala @@ -221,7 +221,7 @@ object PickleBuffer { FINAL_PKL -> Final, METHOD_PKL -> Method, INTERFACE_PKL -> NoInitsInterface, - MODULE_PKL -> Module, + MODULE_PKL -> (Module | Lazy, Module), IMPLICIT_PKL -> Implicit, SEALED_PKL -> Sealed, CASE_PKL -> Case, @@ -287,7 +287,7 @@ object PickleBuffer { val shift = ChunkBits val mask = ChunkSize - 1 assert(6 * ChunkBits == ScalaFlagEnd) - val t = FlagSet( + FlagSet( map(0)((sflags >>> (shift * 0)).toInt & mask) | map(1)((sflags >>> (shift * 1)).toInt & mask) | map(2)((sflags >>> (shift * 2)).toInt & mask) | @@ -295,8 +295,5 @@ object PickleBuffer { map(4)((sflags >>> (shift * 4)).toInt & mask) | map(5)((sflags >>> (shift * 5)).toInt & mask) ) - if (!isType && t.is(Module, Lazy)) - t | Lazy // scala2 modules do not always set lazy flag. Dotty modules do - else t } } diff --git a/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/src/dotty/tools/dotc/transform/ExplicitOuter.scala index daf8c85d20c6..0dda44e840dc 100644 --- a/src/dotty/tools/dotc/transform/ExplicitOuter.scala +++ b/src/dotty/tools/dotc/transform/ExplicitOuter.scala @@ -175,7 +175,8 @@ object ExplicitOuter { /** Class is always instantiated in the compilation unit where it is defined */ private def hasLocalInstantiation(cls: ClassSymbol)(implicit ctx: Context): Boolean = // scala2x modules always take an outer pointer(as of 2.11) - cls.owner.isTerm || cls.is(Private) || cls.is(Module, Scala2x) + // dotty modules are always locally instantiated + cls.owner.isTerm || cls.is(Private) || cls.is(Module, butNot = Scala2x) /** The outer parameter accessor of cass `cls` */ private def outerParamAccessor(cls: ClassSymbol)(implicit ctx: Context): TermSymbol = diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala index 0094e69654e6..32b268fc75f9 100644 --- a/src/dotty/tools/dotc/transform/Mixin.scala +++ b/src/dotty/tools/dotc/transform/Mixin.scala @@ -216,7 +216,7 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform => val rhs = if (ctx.atPhase(thisTransform)(implicit ctx => getter.is(ParamAccessor))) nextArgument() else if (isScala2x) - if (getter.is(Lazy, Module)) lazyGetterCall + if (getter.is(Lazy, butNot = Module)) lazyGetterCall else if (getter.is(Module)) New(getter.info.resultType, List(This(cls))) else Underscore(getter.info.resultType)