summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/cmd/gen/AnyVals.scala11
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala17
-rw-r--r--src/library/scala/Boolean.scala7
-rw-r--r--src/library/scala/Byte.scala8
-rw-r--r--src/library/scala/Char.scala8
-rw-r--r--src/library/scala/Double.scala8
-rw-r--r--src/library/scala/Float.scala8
-rw-r--r--src/library/scala/Int.scala8
-rw-r--r--src/library/scala/Long.scala8
-rw-r--r--src/library/scala/Short.scala8
-rw-r--r--src/library/scala/runtime/StringAdd.scala5
-rw-r--r--src/library/scala/runtime/StringFormat.scala6
-rw-r--r--src/reflect/scala/tools/nsc/io/VirtualFile.scala2
-rw-r--r--src/reflect/scala/tools/nsc/io/ZipArchive.scala2
15 files changed, 86 insertions, 22 deletions
diff --git a/src/compiler/scala/tools/cmd/gen/AnyVals.scala b/src/compiler/scala/tools/cmd/gen/AnyVals.scala
index 910804245b..b4f5641b98 100644
--- a/src/compiler/scala/tools/cmd/gen/AnyVals.scala
+++ b/src/compiler/scala/tools/cmd/gen/AnyVals.scala
@@ -320,7 +320,13 @@ def unbox(x: java.lang.Object): @name@ = @unboxImpl@
override def toString = "object scala.@name@"
"""
- def nonUnitCompanions = "" // todo
+ def nonUnitCompanions = """
+/** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[@name@]
+ */
+final val emptyArray = new Array[@name@](0)"""
def cardinalCompanion = """
/** The smallest value representable as a @name@.
@@ -341,9 +347,6 @@ final val NaN = @boxed@.NaN
final val PositiveInfinity = @boxed@.POSITIVE_INFINITY
final val NegativeInfinity = @boxed@.NEGATIVE_INFINITY
-@deprecated("use @name@.MinPositiveValue instead", "2.9.0")
-final val Epsilon = MinPositiveValue
-
/** The negative number with the greatest (finite) absolute value which is representable
* by a @name@. Note that it differs from [[java.lang.@name@.MIN_VALUE]], which
* is the smallest positive value representable by a @name@. In Scala that number
diff --git a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
index bbeb549289..5ca4712cd2 100644
--- a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
@@ -106,7 +106,7 @@ trait ContextErrors {
else
s"$name extends Any, not AnyRef"
)
- if (isPrimitiveValueType(found)) "" else "\n" +
+ if (isPrimitiveValueType(found) || isTrivialTopType(tp)) "" else "\n" +
s"""|Note that $what.
|Such types can participate in value classes, but instances
|cannot appear in singleton types or in reference comparisons.""".stripMargin
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index 63050bc032..981ba10183 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -287,16 +287,18 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
// FIXME - this should be unified with needsProtectedAccessor, but some
// subtlety which presently eludes me is foiling my attempts.
val shouldEnsureAccessor = (
- currentClass.isTrait
+ currentClass.isTrait
&& sym.isProtected
&& sym.enclClass != currentClass
&& !sym.owner.isTrait
&& (sym.owner.enclosingPackageClass != currentClass.enclosingPackageClass)
- && (qual.symbol.info.member(sym.name) ne NoSymbol))
+ && (qual.symbol.info.member(sym.name) ne NoSymbol)
+ && !needsProtectedAccessor(sym, tree.pos))
if (shouldEnsureAccessor) {
log("Ensuring accessor for call to protected " + sym.fullLocationString + " from " + currentClass)
ensureAccessor(sel)
- } else
+ }
+ else
mayNeedProtectedAccessor(sel, EmptyTree.asList, false)
}
@@ -525,7 +527,14 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
)
true
}
- isCandidate && !host.isPackageClass && !isSelfType
+ def isJavaProtected = host.isTrait && sym.isJavaDefined && {
+ restrictionError(pos, unit,
+ s"""|$clazz accesses protected $sym inside a concrete trait method.
+ |Add an accessor in a class extending ${sym.enclClass} as a workaround.""".stripMargin
+ )
+ true
+ }
+ isCandidate && !host.isPackageClass && !isSelfType && !isJavaProtected
}
/** Return the innermost enclosing class C of referencingClass for which either
diff --git a/src/library/scala/Boolean.scala b/src/library/scala/Boolean.scala
index 440e546f19..d7311078ab 100644
--- a/src/library/scala/Boolean.scala
+++ b/src/library/scala/Boolean.scala
@@ -135,5 +135,12 @@ object Boolean extends AnyValCompanion {
*/
override def toString = "object scala.Boolean"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Boolean]
+ */
+ final val emptyArray = new Array[Boolean](0)
}
diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala
index df0d2c73b1..02ef913fc5 100644
--- a/src/library/scala/Byte.scala
+++ b/src/library/scala/Byte.scala
@@ -625,6 +625,14 @@ object Byte extends AnyValCompanion {
*/
override def toString = "object scala.Byte"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Byte]
+ */
+ final val emptyArray = new Array[Byte](0)
+
/** Language mandated coercions from Byte to "wider" types.
*/
implicit def byte2short(x: Byte): Short = x.toShort
diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala
index 1fa0c0d9e8..5a1bf16f1d 100644
--- a/src/library/scala/Char.scala
+++ b/src/library/scala/Char.scala
@@ -625,6 +625,14 @@ object Char extends AnyValCompanion {
*/
override def toString = "object scala.Char"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Char]
+ */
+ final val emptyArray = new Array[Char](0)
+
/** Language mandated coercions from Char to "wider" types.
*/
implicit def char2int(x: Char): Int = x.toInt
diff --git a/src/library/scala/Double.scala b/src/library/scala/Double.scala
index f058d7c26b..7bebbf9418 100644
--- a/src/library/scala/Double.scala
+++ b/src/library/scala/Double.scala
@@ -400,5 +400,13 @@ object Double extends AnyValCompanion {
/** The String representation of the scala.Double companion object.
*/
override def toString = "object scala.Double"
+
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Double]
+ */
+ final val emptyArray = new Array[Double](0)
}
diff --git a/src/library/scala/Float.scala b/src/library/scala/Float.scala
index d942acec23..79ed2ac20b 100644
--- a/src/library/scala/Float.scala
+++ b/src/library/scala/Float.scala
@@ -401,6 +401,14 @@ object Float extends AnyValCompanion {
*/
override def toString = "object scala.Float"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Float]
+ */
+ final val emptyArray = new Array[Float](0)
+
/** Language mandated coercions from Float to "wider" types.
*/
implicit def float2double(x: Float): Double = x.toDouble
diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala
index ae36413469..fa2f9a97e7 100644
--- a/src/library/scala/Int.scala
+++ b/src/library/scala/Int.scala
@@ -625,6 +625,14 @@ object Int extends AnyValCompanion {
*/
override def toString = "object scala.Int"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Int]
+ */
+ final val emptyArray = new Array[Int](0)
+
/** Language mandated coercions from Int to "wider" types.
*/
implicit def int2long(x: Int): Long = x.toLong
diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala
index 4ee9383c2a..94204e893c 100644
--- a/src/library/scala/Long.scala
+++ b/src/library/scala/Long.scala
@@ -625,6 +625,14 @@ object Long extends AnyValCompanion {
*/
override def toString = "object scala.Long"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Long]
+ */
+ final val emptyArray = new Array[Long](0)
+
/** Language mandated coercions from Long to "wider" types.
*/
implicit def long2float(x: Long): Float = x.toFloat
diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala
index 35c5fe3ff0..aef8608d2e 100644
--- a/src/library/scala/Short.scala
+++ b/src/library/scala/Short.scala
@@ -625,6 +625,14 @@ object Short extends AnyValCompanion {
*/
override def toString = "object scala.Short"
+
+ /** A highly reusable empty array, useful for avoiding
+ * allocations when you need one.
+ *
+ * @return a constant 0-length Array[Short]
+ */
+ final val emptyArray = new Array[Short](0)
+
/** Language mandated coercions from Short to "wider" types.
*/
implicit def short2int(x: Short): Int = x.toInt
diff --git a/src/library/scala/runtime/StringAdd.scala b/src/library/scala/runtime/StringAdd.scala
index 4693b0bf44..f074b5407e 100644
--- a/src/library/scala/runtime/StringAdd.scala
+++ b/src/library/scala/runtime/StringAdd.scala
@@ -10,10 +10,5 @@ package scala.runtime
/** A wrapper class that adds string concatenation `+` to any value */
final class StringAdd(val self: Any) extends AnyVal {
- // Note: The implicit conversion from Any to StringAdd is one of two
- // implicit conversions from Any to AnyRef in Predef. It is important to have at least
- // two such conversions, so that silent conversions from value types to AnyRef
- // are avoided. If StringFormat should become a value class, another
- // implicit conversion from Any to AnyRef has to be introduced in Predef
def +(other: String) = String.valueOf(self) + other
}
diff --git a/src/library/scala/runtime/StringFormat.scala b/src/library/scala/runtime/StringFormat.scala
index 1f5feec9e1..7d34e82812 100644
--- a/src/library/scala/runtime/StringFormat.scala
+++ b/src/library/scala/runtime/StringFormat.scala
@@ -11,12 +11,6 @@ package scala.runtime
/** A wrapper class that adds a `formatted` operation to any value
*/
final class StringFormat(val self: Any) extends AnyVal {
- // Note: The implicit conversion from Any to StringFormat is one of two
- // implicit conversions from Any to AnyRef in Predef. It is important to have at least
- // two such conversions, so that silent conversions from value types to AnyRef
- // are avoided. If StringFormat should become a value class, another
- // implicit conversion from Any to AnyRef has to be introduced in Predef
-
/** Returns string formatted according to given `format` string.
* Format strings are as for `String.format`
* (@see java.lang.String.format).
diff --git a/src/reflect/scala/tools/nsc/io/VirtualFile.scala b/src/reflect/scala/tools/nsc/io/VirtualFile.scala
index be888e92e6..9061534edc 100644
--- a/src/reflect/scala/tools/nsc/io/VirtualFile.scala
+++ b/src/reflect/scala/tools/nsc/io/VirtualFile.scala
@@ -33,7 +33,7 @@ class VirtualFile(val name: String, override val path: String) extends AbstractF
//########################################################################
// Private data
- private var content = new Array[Byte](0)
+ private var content = Byte.emptyArray
//########################################################################
// Public Methods
diff --git a/src/reflect/scala/tools/nsc/io/ZipArchive.scala b/src/reflect/scala/tools/nsc/io/ZipArchive.scala
index d7ec209525..9d9d9a46f2 100644
--- a/src/reflect/scala/tools/nsc/io/ZipArchive.scala
+++ b/src/reflect/scala/tools/nsc/io/ZipArchive.scala
@@ -177,7 +177,7 @@ final class URLZipArchive(val url: URL) extends ZipArchive(null) {
class FileEntry() extends Entry(zipEntry.getName) {
override val toByteArray: Array[Byte] = {
val len = zipEntry.getSize().toInt
- val arr = new Array[Byte](len)
+ val arr = if (len == 0) Byte.emptyArray else new Array[Byte](len)
var offset = 0
def loop() {