summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2013-09-17 00:14:17 -0700
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2013-09-17 00:14:17 -0700
commit543dfcde74a0a3c60f9507ace133ff7e0026115f (patch)
tree4f1aef5e09f1f344f29279d80d3e912f4c99b946 /src/reflect
parent9dbc321504ad5550638d6d7c2b3cd2f98273cf74 (diff)
parentcff8b569c39fb2ce57157fa6adf4ab9289721033 (diff)
downloadscala-543dfcde74a0a3c60f9507ace133ff7e0026115f.tar.gz
scala-543dfcde74a0a3c60f9507ace133ff7e0026115f.tar.bz2
scala-543dfcde74a0a3c60f9507ace133ff7e0026115f.zip
Merge pull request #2950 from retronym/ticket/7841
Damage control related to AnyRef specialization
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/Names.scala2
-rw-r--r--src/reflect/scala/reflect/internal/StdNames.scala39
2 files changed, 27 insertions, 14 deletions
diff --git a/src/reflect/scala/reflect/internal/Names.scala b/src/reflect/scala/reflect/internal/Names.scala
index ed248d6e1e..f998d95349 100644
--- a/src/reflect/scala/reflect/internal/Names.scala
+++ b/src/reflect/scala/reflect/internal/Names.scala
@@ -90,6 +90,8 @@ trait Names extends api.Names {
*/
final def newTermName(cs: Array[Char], offset: Int, len: Int, cachedString: String): TermName = {
def body = {
+ require(offset >= 0, "offset must be non-negative, got " + offset)
+ require(len >= 0, "length must be non-negative, got " + len)
val h = hashValue(cs, offset, len) & HASH_MASK
var n = termHashtable(h)
while ((n ne null) && (n.length != len || !equals(n.start, cs, offset, len)))
diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala
index 686ebf5a1e..6407a3979c 100644
--- a/src/reflect/scala/reflect/internal/StdNames.scala
+++ b/src/reflect/scala/reflect/internal/StdNames.scala
@@ -413,32 +413,43 @@ trait StdNames {
@deprecated("Use Name#getterName", "2.11.0") def getterName(name: TermName): TermName = name.getterName
@deprecated("Use Name#getterName", "2.11.0") def setterToGetter(name: TermName): TermName = name.getterName
+ /**
+ * Convert `Tuple2$mcII` to `Tuple2`, or `T1$sp` to `T1`.
+ */
def unspecializedName(name: Name): Name = (
- if (name endsWith SPECIALIZED_SUFFIX)
- name.subName(0, name.lastIndexOf('m') - 1)
+ // DUPLICATED LOGIC WITH `splitSpecializedName`
+ if (name endsWith SPECIALIZED_SUFFIX) {
+ val idxM = name.lastIndexOf('m')
+ val to = (if (idxM > 0) idxM - 1 else name.length - SPECIALIZED_SUFFIX.length)
+ name.subName(0, to)
+ }
else name
)
/** Return the original name and the types on which this name
* is specialized. For example,
* {{{
- * splitSpecializedName("foo$mIcD$sp") == ('foo', "I", "D")
+ * splitSpecializedName("foo$mIcD$sp") == ('foo', "D", "I")
* }}}
* `foo$mIcD$sp` is the name of a method specialized on two type
* parameters, the first one belonging to the method itself, on Int,
* and another one belonging to the enclosing class, on Double.
+ *
+ * @return (unspecializedName, class tparam specializations, method tparam specializations)
*/
- def splitSpecializedName(name: Name): (Name, String, String) =
- if (name endsWith SPECIALIZED_SUFFIX) {
- val name1 = name dropRight SPECIALIZED_SUFFIX.length
- val idxC = name1 lastIndexOf 'c'
- val idxM = name1 lastIndexOf 'm'
-
- (name1.subName(0, idxM - 1),
- name1.subName(idxC + 1, name1.length).toString,
- name1.subName(idxM + 1, idxC).toString)
- } else
- (name, "", "")
+ def splitSpecializedName(name: Name): (Name, String, String) = {
+ // DUPLICATED LOGIC WITH `unspecializedName`
+ if (name endsWith SPECIALIZED_SUFFIX) {
+ val name1 = name dropRight SPECIALIZED_SUFFIX.length
+ val idxC = name1 lastIndexOf 'c'
+ val idxM = name1 lastIndexOf 'm'
+ if (idxC > idxM && idxM > 0)
+ (name1.subName(0, idxM - 1), name1.subName(idxC + 1, name1.length).toString, name1.subName(idxM + 1, idxC).toString)
+ else
+ (name.subName(0, name.length - SPECIALIZED_SUFFIX.length), "", "")
+ }
+ else (name, "", "")
+ }
// Nominally, name$default$N, encoded for <init>
def defaultGetterName(name: Name, pos: Int): TermName = (