summaryrefslogtreecommitdiff
path: root/test/files/run/t6028.check
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-09-13 22:45:10 +1000
committerJason Zaugg <jzaugg@gmail.com>2016-09-14 21:10:02 +1000
commita5bb6e00f051bf93fe7df4a02583eba478fa5ca1 (patch)
tree0ee00b83916dbd5b7bb8ca42956335107432ee3f /test/files/run/t6028.check
parent05016d9035ab9b1c866bd9f12fdd0491f1ea0cbb (diff)
downloadscala-a5bb6e00f051bf93fe7df4a02583eba478fa5ca1.tar.gz
scala-a5bb6e00f051bf93fe7df4a02583eba478fa5ca1.tar.bz2
scala-a5bb6e00f051bf93fe7df4a02583eba478fa5ca1.zip
SD-225 Use a "lzycompute" method for module initialization
The monitors and module instantation were inliuned into the module accessor method in b2e0911. However, this seems to have had a detrimental impact on performance. This might be because the module accessors are now above the "always inline" HotSpot threshold of 35 bytes, or perhaps because they contain monitor-entry/exit and exception handlers. This commit returns to the the 2.11.8 appraoch of factoring the the second check of the doublecheck locking into a method. I've done this by declaring a nested method within the accessor; this will be lifted out to the class level by lambdalift. This represents a slight deviation from the implementation strategy used for lazy accessors, which create a symbol for the slowpath method in the info transform and generate the corresponding DefDef as a class member. I don't believe this deviation is particular worrisome, though. I have bootstrapped the compiler through this commit and found that the drastic regression in compiling the shapeless test suite is solved.
Diffstat (limited to 'test/files/run/t6028.check')
-rw-r--r--test/files/run/t6028.check5
1 files changed, 3 insertions, 2 deletions
diff --git a/test/files/run/t6028.check b/test/files/run/t6028.check
index d6cc452bbf..80f8698ecf 100644
--- a/test/files/run/t6028.check
+++ b/test/files/run/t6028.check
@@ -54,10 +54,11 @@ package <empty> {
<synthetic> <stable> <artifact> def $outer(): T = MethodLocalObject$2.this.$outer;
<synthetic> <stable> <artifact> def $outer(): T = MethodLocalObject$2.this.$outer
};
+ final private[this] def MethodLocalObject$lzycompute$1(barParam$1: Int, MethodLocalObject$module$1: runtime.VolatileObjectRef): Unit = T.this.synchronized[Unit](if (MethodLocalObject$module$1.elem.$asInstanceOf[T#MethodLocalObject$2.type]().eq(null))
+ MethodLocalObject$module$1.elem = new T#MethodLocalObject$2.type(T.this, barParam$1));
final <stable> private[this] def MethodLocalObject$1(barParam$1: Int, MethodLocalObject$module$1: runtime.VolatileObjectRef): T#MethodLocalObject$2.type = {
if (MethodLocalObject$module$1.elem.$asInstanceOf[T#MethodLocalObject$2.type]().eq(null))
- T.this.synchronized[Unit](if (MethodLocalObject$module$1.elem.$asInstanceOf[T#MethodLocalObject$2.type]().eq(null))
- MethodLocalObject$module$1.elem = new T#MethodLocalObject$2.type(T.this, barParam$1));
+ T.this.MethodLocalObject$lzycompute$1(barParam$1, MethodLocalObject$module$1);
MethodLocalObject$module$1.elem.$asInstanceOf[T#MethodLocalObject$2.type]()
};
@SerialVersionUID(value = 0) final <synthetic> class $anonfun$tryy$1 extends scala.runtime.AbstractFunction0$mcV$sp with Serializable {