aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-03-31 10:33:36 +0200
committerMartin Odersky <odersky@gmail.com>2017-03-31 10:33:36 +0200
commit6aba35fc6aff1f7de4d0395df189cd75ed0acff1 (patch)
tree17e939edfbb6e399a597a7ee510a293f1cedfa8b
parentf801c835d8a1b359afe2f00aa270fe6e42923f2e (diff)
downloaddotty-6aba35fc6aff1f7de4d0395df189cd75ed0acff1.tar.gz
dotty-6aba35fc6aff1f7de4d0395df189cd75ed0acff1.tar.bz2
dotty-6aba35fc6aff1f7de4d0395df189cd75ed0acff1.zip
Optimize hashCode computation
Also, update check file.
-rw-r--r--compiler/src/dotty/tools/dotc/transform/SyntheticMethods.scala4
-rw-r--r--tests/run/caseClassHash.check8
2 files changed, 6 insertions, 6 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/SyntheticMethods.scala b/compiler/src/dotty/tools/dotc/transform/SyntheticMethods.scala
index adf65c3bb..bb11348c2 100644
--- a/compiler/src/dotty/tools/dotc/transform/SyntheticMethods.scala
+++ b/compiler/src/dotty/tools/dotc/transform/SyntheticMethods.scala
@@ -149,7 +149,7 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
* gets the hashCode method:
*
* def hashCode: Int = {
- * <synthetic> var acc: Int = productPrefix.hashCode()
+ * <synthetic> var acc: Int = "C".hashCode // constant folded
* acc = Statics.mix(acc, x);
* acc = Statics.mix(acc, Statics.this.anyHash(y));
* Statics.finalizeHash(acc, 2)
@@ -157,7 +157,7 @@ class SyntheticMethods(thisTransformer: DenotTransformer) {
*/
def caseHashCodeBody(implicit ctx: Context): Tree = {
val acc = ctx.newSymbol(ctx.owner, "acc".toTermName, Mutable | Synthetic, defn.IntType, coord = ctx.owner.pos)
- val accDef = ValDef(acc, This(clazz).select(defn.Product_productPrefix).select(defn.Any_hashCode).ensureApplied)
+ val accDef = ValDef(acc, Literal(Constant(clazz.name.toString.hashCode)))
val mixes = for (accessor <- accessors.toList) yield
Assign(ref(acc), ref(defn.staticsMethod("mix")).appliedTo(ref(acc), hashImpl(accessor)))
val finish = ref(defn.staticsMethod("finalizeHash")).appliedTo(ref(acc), Literal(Constant(accessors.size)))
diff --git a/tests/run/caseClassHash.check b/tests/run/caseClassHash.check
index b5a6f08e9..332fd477d 100644
--- a/tests/run/caseClassHash.check
+++ b/tests/run/caseClassHash.check
@@ -1,9 +1,9 @@
Foo(true,-1,-1,d,-5,-10,500.0,500.0,List(),5.0)
Foo(true,-1,-1,d,-5,-10,500.0,500.0,List(),5)
-1383698062
-1383698062
+205963949
+205963949
true
-## method 1: 1383698062
-## method 2: 1383698062
+## method 1: 205963949
+## method 2: 205963949
Murmur 1: 1383698062
Murmur 2: 1383698062