Aladdin - Scala Bugtracking
[#828] project: compiler priority: low category: missing feature
submitter assigned to status date submitted
Nikolay Martin fixed 2006-11-16 17:36:50.0
subject [contrib #250] generated equals should include identity test
code
def equalsMethod: Tree = {
      val target = getMember(ScalaRunTimeModule, nme._equals)
      val paramtypes =
        if (target.tpe.paramTypes.isEmpty) List()
        else target.tpe.paramTypes.tail
      val method = syntheticMethod(
       nme.equals_, 0, MethodType(paramtypes, target.tpe.resultType))
      typed(DefDef(method, vparamss =>
        Apply(
          Select(
            Apply(
              Select(Ident(vparamss.head.head), Object_eq), 
              List(This(clazz))), 
            Boolean_or),
          List(
            Apply(
              Select(
                TypeApply(
                  Select(Ident(vparamss.head.head), Any_isInstanceOf),
                  List(TypeTree(clazz.tpe))),
                Boolean_and),
              List(
                Apply(gen.mkAttributedRef(target), This(clazz) :: (vparamss.head map Ident))))))));
    }
what happened
current "equals" methods do an instanceof test and then call the scala runtime's equal method. i believe this ca\
n be shortcircuited for the case where the object is being tested against itself for equality. the modification \
to the generator for the equals method given above seems to do the trick.

what expected case class .equals method needs to be as efficient as possible, particularly when hash-consing is being used.
[back to overview]
Changes of this bug report
Nikolay  edited on  2006-11-16 17:39:13.0
This is a contribution (#250) from Ross Judson. Martin, what do you say?
Nikolay  edited on  2006-11-17 11:25:15.0