From 91c61e4694097971b9a0c139048b7239d0f05588 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 28 Nov 2014 22:10:37 +0100 Subject: Previous scheme was buggy; leaked Array types to backend. Now: All new Array[T] methods are translated to calls of the form dotty.Arrays.newXYZArray ... --- src/dotty/tools/dotc/core/Contexts.scala | 2 +- src/dotty/tools/dotc/core/Definitions.scala | 7 +++++++ src/dotty/tools/dotc/core/NameOps.scala | 1 - src/dotty/tools/dotc/core/StdNames.scala | 4 +--- 4 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src/dotty/tools/dotc/core') diff --git a/src/dotty/tools/dotc/core/Contexts.scala b/src/dotty/tools/dotc/core/Contexts.scala index 6293d18d2..6824cc36c 100644 --- a/src/dotty/tools/dotc/core/Contexts.scala +++ b/src/dotty/tools/dotc/core/Contexts.scala @@ -120,7 +120,7 @@ object Contexts { protected def scope_=(scope: Scope) = _scope = scope def scope: Scope = _scope - /** The current type assigner ot typer */ + /** The current type assigner or typer */ private[this] var _typeAssigner: TypeAssigner = _ protected def typeAssigner_=(typeAssigner: TypeAssigner) = _typeAssigner = typeAssigner def typeAssigner: TypeAssigner = _typeAssigner diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index d78e09418..20dd899f1 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -193,6 +193,10 @@ class Definitions { def staticsMethod(name: PreName) = ctx.requiredMethod(ScalaStaticsClass, name) lazy val DottyPredefModule = ctx.requiredModule("dotty.DottyPredef") + lazy val DottyArraysModule = ctx.requiredModule("dotty.runtime.Arrays") + + def newRefArrayMethod = ctx.requiredMethod(DottyArraysModule.moduleClass.asClass, "newRefArray") + lazy val NilModule = ctx.requiredModule("scala.collection.immutable.Nil") lazy val PredefConformsClass = ctx.requiredClass("scala.Predef." + tpnme.Conforms) @@ -211,6 +215,7 @@ class Definitions { lazy val Array_update = ctx.requiredMethod(ArrayClass, nme.update) lazy val Array_length = ctx.requiredMethod(ArrayClass, nme.length) lazy val Array_clone = ctx.requiredMethod(ArrayClass, nme.clone_) + lazy val ArrayConstructor = ctx.requiredMethod(ArrayClass, nme.CONSTRUCTOR) lazy val traversableDropMethod = ctx.requiredMethod(ScalaRuntimeClass, nme.drop) lazy val uncheckedStableClass: ClassSymbol = ctx.requiredClass("scala.annotation.unchecked.uncheckedStable") @@ -428,6 +433,8 @@ class Definitions { lazy val PhantomClasses = Set[Symbol](AnyClass, AnyValClass, NullClass, NothingClass) + lazy val isPolymorphicAfterErasure = Set[Symbol](Any_isInstanceOf, Any_asInstanceOf, newRefArrayMethod) + lazy val RootImports = List[Symbol](JavaLangPackageVal, ScalaPackageVal, ScalaPredefModule, DottyPredefModule) lazy val overriddenBySynthetic = Set[Symbol](Any_equals, Any_hashCode, Any_toString, Product_canEqual) diff --git a/src/dotty/tools/dotc/core/NameOps.scala b/src/dotty/tools/dotc/core/NameOps.scala index bc15f6a06..a6b40fe66 100644 --- a/src/dotty/tools/dotc/core/NameOps.scala +++ b/src/dotty/tools/dotc/core/NameOps.scala @@ -204,7 +204,6 @@ object NameOps { case nme.length => nme.primitive.arrayLength case nme.update => nme.primitive.arrayUpdate case nme.clone_ => nme.clone_ - case nme.CONSTRUCTOR => nme.primitive.arrayConstructor } /** If name length exceeds allowable limit, replace part of it by hash */ diff --git a/src/dotty/tools/dotc/core/StdNames.scala b/src/dotty/tools/dotc/core/StdNames.scala index 8393eb56f..959e9cb84 100644 --- a/src/dotty/tools/dotc/core/StdNames.scala +++ b/src/dotty/tools/dotc/core/StdNames.scala @@ -433,7 +433,6 @@ object StdNames { val moduleClass : N = "moduleClass" val name: N = "name" val ne: N = "ne" - val newArray: N = "newArray" val newFreeTerm: N = "newFreeTerm" val newFreeType: N = "newFreeType" val newNestedSymbol: N = "newNestedSymbol" @@ -691,8 +690,7 @@ object StdNames { val arrayApply: TermName = "[]apply" val arrayUpdate: TermName = "[]update" val arrayLength: TermName = "[]length" - val arrayConstructor: TermName = "[]" - val names: Set[Name] = Set(arrayApply, arrayUpdate, arrayLength, arrayConstructor) + val names: Set[Name] = Set(arrayApply, arrayUpdate, arrayLength) } def isPrimitiveName(name: Name) = primitive.names.contains(name) -- cgit v1.2.3