summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/symtab/Symbol.java7
-rw-r--r--sources/scalac/typechecker/RefCheck.java11
2 files changed, 17 insertions, 1 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index c3da3e15d9..28772e6bc5 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -1051,6 +1051,13 @@ public abstract class Symbol implements Modifiers, Kinds {
this.infos = TypeIntervalList.EMPTY;
this.setInfo(completer);
}
+
+ /** return a tag which (in the ideal case) uniquely identifies
+ * class symbols
+ */
+ public int tag() {
+ return name.toString().hashCode();
+ }
}
/** A class for term symbols
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index 460e98abeb..d25c547e20 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -588,7 +588,6 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
testtp = testtp.subst(tparams, targs);
}
}
-
// if (that is C) {...
Tree cond = gen.TypeApply(
gen.Select(
@@ -639,6 +638,15 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
return gen.Select(qual, clazz.caseFieldAccessor(i));
}
+ private Tree tagMethod(ClassSymbol clazz) {
+ Symbol tagSym = new TermSymbol(
+ clazz.pos, Names.tag, clazz,
+ clazz.isSubClass(defs.OBJECT_CLASS) ? OVERRIDE : 0)
+ .setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, defs.INT_TYPE));
+ clazz.info().members().enter(tagSym);
+ return gen.DefDef(clazz.pos, tagSym, gen.mkIntLit(clazz.pos, clazz.tag()));
+ }
+
private Tree hashCodeMethod(ClassSymbol clazz) {
Symbol hashCodeSym = new TermSymbol(
clazz.pos, Names.hashCode, clazz, OVERRIDE)
@@ -693,6 +701,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
ts.append(equalsMethod(clazz));
if (!hasImplementation(clazz, Names.hashCode))
ts.append(hashCodeMethod(clazz));
+ ts.append(tagMethod(clazz));
if (ts.length() > 0) {
Tree[] stats1 = new Tree[stats.length + ts.length()];
System.arraycopy(stats, 0, stats1, 0, stats.length);