summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/reflect/scala/reflect/internal/Constants.scala9
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala7
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala39
3 files changed, 11 insertions, 44 deletions
diff --git a/src/reflect/scala/reflect/internal/Constants.scala b/src/reflect/scala/reflect/internal/Constants.scala
index 61fa553484..4e232e486b 100644
--- a/src/reflect/scala/reflect/internal/Constants.scala
+++ b/src/reflect/scala/reflect/internal/Constants.scala
@@ -73,13 +73,8 @@ trait Constants extends api.Constants {
case DoubleTag => DoubleClass.tpe
case StringTag => StringClass.tpe
case NullTag => NullClass.tpe
- case ClazzTag => ClassType(value.asInstanceOf[Type])
- case EnumTag =>
- // given (in java): "class A { enum E { VAL1 } }"
- // - symbolValue: the symbol of the actual enumeration value (VAL1)
- // - .owner: the ModuleClasSymbol of the enumeration (object E)
- // - .linkedClassOfClass: the ClassSymbol of the enumeration (class E)
- symbolValue.owner.linkedClassOfClass.tpe
+ case ClazzTag => ClassType(typeValue)
+ case EnumTag => EnumType(symbolValue)
}
/** We need the equals method to take account of tags as well as values.
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 2db8c29a63..b607f8cad9 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -713,6 +713,13 @@ trait Definitions extends api.StandardDefinitions {
if (phase.erasedTypes || forMSIL) ClassClass.tpe
else appliedType(ClassClass, arg)
+ def EnumType(sym: Symbol) =
+ // given (in java): "class A { enum E { VAL1 } }"
+ // - sym: the symbol of the actual enumeration value (VAL1)
+ // - .owner: the ModuleClassSymbol of the enumeration (object E)
+ // - .linkedClassOfClass: the ClassSymbol of the enumeration (class E)
+ sym.owner.linkedClassOfClass.tpe
+
def vmClassType(arg: Type): Type = ClassType(arg)
def vmSignature(sym: Symbol, info: Type): String = signature(info) // !!!
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index ee488c9d18..4311f1dd4f 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -2018,45 +2018,10 @@ trait Types extends api.Types { self: SymbolTable =>
override def kind = "ConstantType"
}
- final class UniqueConstantType(value: Constant) extends ConstantType(value) {
- /** Save the type of `value`. For Java enums, it depends on finding the linked class,
- * which might not be found after `flatten`. */
- private lazy val _tpe: Type = value.tpe
- override def underlying: Type = _tpe
- }
+ final class UniqueConstantType(value: Constant) extends ConstantType(value)
object ConstantType extends ConstantTypeExtractor {
- def apply(value: Constant): ConstantType = {
- val tpe = new UniqueConstantType(value)
- if (value.tag == ClazzTag) {
- // if we carry a classOf, we might be in trouble
- // http://groups.google.com/group/scala-internals/browse_thread/thread/45185b341aeb6a30
- // I don't have time for a thorough fix, so I put a hacky workaround here
- val alreadyThere = uniques findEntry tpe
- if ((alreadyThere ne null) && (alreadyThere ne tpe) && (alreadyThere.toString != tpe.toString)) {
- // we need to remove a stale type that has the same hashcode as we do
- // HashSet doesn't support removal, and this makes our task non-trivial
- // also we cannot simply recreate it, because that'd skew hashcodes (that change over time, omg!)
- // the only solution I can see is getting into the underlying array and sneakily manipulating it
- val ftable = uniques.getClass.getDeclaredFields().find(f => f.getName endsWith "table").get
- ftable.setAccessible(true)
- val table = ftable.get(uniques).asInstanceOf[Array[AnyRef]]
- def overwrite(hc: Int, x: Type) {
- def index(x: Int): Int = math.abs(x % table.length)
- var h = index(hc)
- var entry = table(h)
- while (entry ne null) {
- if (x == entry)
- table(h) = x
- h = index(h + 1)
- entry = table(h)
- }
- }
- overwrite(tpe.##, tpe)
- }
- }
- unique(tpe).asInstanceOf[ConstantType]
- }
+ def apply(value: Constant) = unique(new UniqueConstantType(value))
}
/* Syncnote: The `volatile` var and `pendingVolatiles` mutable set need not be protected