diff options
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 7 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 11 |
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); |